Камнем преткновения, как я уверен, вы знаете, является получение всего значения индексированного массива, когда его имя используется как значение (другой )переменной. Я не мог сделать это с меньшим, чем с промежуточным значением, значение которого становится форматом ${v[@]}
, а затем использовать для этого eval. Итак, вот этот подход:
declare -A keys
N=0 # counter for the index variables IX1, IX2, IX3,...
for key in "${!hash[@]}"; do
value="${hash[$key]}"
if [ -z "${keys[$value]}" ] ; then N=$((N+1)) ; keys[$value]=IX$N ; fi
index="${keys[$value]}" # 'index' is now name of index variable
X="\${$index[@]}"
eval "$index=( $X $key )" # adding next key to it
done
for value in "${!keys[@]}" ; do
index=${keys[$value]}
X="\${$index[@]}"
printf "Value %s is present with the following keys: %s\n" \
"$value" "$(eval echo "$X")"
done
Это для Linux bash
. Он создает индексированные массивы IX1
, IX2
и т. д. для различных встречающихся значений и сохраняет эти имена в ассоциативном массиве keys
для значений. Таким образом, ${keys[$value]}
— это имя индексированного массива, содержащего ключи для этого значения. Затем X
настраивается как переменная «фраза доступа» для набора значений, что позволяет eval echo "$X"
преобразовывать эти значения с разделением пробелами. Например, если значение имеет индексированный массив IX2
, то X
будет строкой ${IX2[@]}
.
Я считаю, что zsh
похож на то, что не поддерживает массивы массивов, поэтому, вероятно, потребуется аналогичное решение. ИМХО, фразы доступа в zsh
немного понятнее.
путаница
ssh -vv -i.ssh/authorized_keys -o PasswordAuthentication=no ansible@192.168.12.2
authorized_keys
— это список открытых ключей, которые вы разрешаете подключать.
этот файл должен быть установлен на стороне сервера.
вы должны подключиться, используя свои закрытые ключи, вероятно
ssh -i.ssh/id_rsa ansible@192.168.12.2
подключитесь к 192.168.12.10 с правами пользователя и введите:
mkdir.ssh ; chmod go-rwx.ssh ; cd.ssh
ssh-keygen -t rsa
Принять вариант по умолчанию, не задавать пароль.
Делайте это только один, не делайте этого, если уже есть пара ключей.
если пароль для ansible известен, скопируйте идентификатор файла _rsa.pub, используя
scp id_rsa.pub ansible@192.168.12.2:.ssh/id_rsa_ansible.pub
При первом использовании ssh или scp с 192.168.12.10 на 192.168.12.2 появится диалоговое окно подтверждения.
ansible@192.168.12.2:hosts.ansible
The authenticity of host '192.168.12.10' can't be established.
RSA key fingerprint is 89:dc:fe:d6:4a:40:28:e5:e9:d0:bd:09:28:01:93:23.
Are you sure you want to continue connecting (yes/no)? y
если пароль неизвестен или не установлен, скопируйте строку из id _rsa.pub, используя буфер шпатлевки
Подключиться к 192.168.12.2 с доступом пользователя
mkdir.ssh ; chmod go-rwx.ssh ; cd.ssh
Создать файлы авторизации
cat id_rsa_ansible.pub >> authorized_keys
или скопируйте/вставьте содержимое файла id _rsa.pub из ansible
разрешено _ключи должны:
принадлежат либо ansible (, либо root)
chown ansible authorized_keys
ansible должен быть только записывающим (rw -r --r--)
chmod 644 authorized_keys
подключиться к 192.168.12.10 с доступом пользователя
ssh ansible@192.168.12.2
Вы должны подключиться без ввода пароля
У меня уже есть веб-страница с подробным описанием этих шагов (на французском и английском ), вы можете ввести имена пользователей и имена хостов.