Когда новый сервер добавляется в $SERVER_LIST, сценарий останавливается с помощью:
The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.Are you sure you want to continue connecting (yes/no)?
Я пытался yes:
for h in $SERVER_LIST; do yes | ssh $h "uptime"; done
но безуспешно.
Есть ли способ параметризовать ssh чтобы автоматически принимать любой новый ключ?
Эта опция также может быть добавлена в ~/.ssh/config, например:
Host somehost Hostname 10.0.0.1 StrictHostKeyChecking no
Обратите внимание, что при изменении ключей хоста вы получите предупреждение, даже при использовании этой опции:
$ ssh -oStrictHostKeyChecking=no somehost uptime@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also possible that a host key has just been changed.The fingerprint for the RSA key sent by the remote host is31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.Please contact your system administrator.Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.Offending RSA key in /home/peter/.ssh/known_hosts:24 remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1Password authentication is disabled to avoid man-in-the-middle attacks.Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.ash: uptime: not found
Если ваши хосты не часто переустанавливаются, вы можете сделать это менее безопасным (но более удобным для часто меняющихся ключей хоста) с помощью -oUserKnownHostsFile=/dev/null вариант. При этом отбрасываются все полученные ключи хоста, поэтому предупреждение никогда не будет выдано.
С 18.04 появилась новая возможность: StrictHostKeyChecking=accept-new. Из man 5 ssh_config:
If this flag is set to “accept-new” then ssh will automaticallyadd new host keys to the user known hosts files, but will notpermit connections to hosts with changed host keys. If this flagis set to “no” or “off”, ssh will automatically add new host keysto the user known hosts files and allow connections to hosts withchanged hostkeys to proceed, subject to some restrictions.
записка:>> Замените < ip-адрес и < имя хоста на IP и dns-имя сервера, который вы хотите добавить.
Единственная проблема с этим заключается в том, что в конечном итоге вы дважды столкнетесь с некоторыми серверами в ваших known_hosts. На самом деле в этом нет ничего особенного, просто упоминание. Чтобы убедиться в отсутствии дубликатов, вы можете сначала удалить все серверы, выполнив сначала следующее:
for h in $SERVER_LIST; do ip=$(dig +search +short $h) ssh-keygen -R $h ssh-keygen -R $ip ssh-keyscan -H $ip >> ~/.ssh/known_hosts ssh-keyscan -H $h >> ~/.ssh/known_hostsdone
Одна вещь, которую следует иметь в виду, когда вы удаляете только для повторного добавления, вы, по сути, снимаете безопасность проверки отпечатка пальца. Таким образом, вы определенно не захотите запускать этот скрипт перед каждым выполнением вашего служебного скрипта.
Я немного опоздал с этим ответом, но разумным способом было бы выполнить проверку ssh-ключей на новой машине, прежде чем запускать сбор данных о времени безотказной работы.
ssh-keyscan <newhost> >> ~/.ssh/known_hosts
Отключение проверки работоспособности для удобства звучит как плохой план, даже если вы думаете, что полностью контролируете окружающую среду.
Хотя уже слишком поздно отвечать на этот вопрос, я хотел бы поделиться своим вкладом.
Я только что сделал быстрый сценарий bash, чтобы облегчить себе жизнь.
По сути, всякий раз, когда вы подключаетесь к компьютеру по ssh, он удаляет старый ключ хоста и добавляет новый ключ. Добавьте это в качестве псевдонима к ssh, тогда вам больше не нужно беспокоиться о несоответствии ключей ssh. Скрипт будет вращать их при каждом входе в систему.
#!/bin/bash{ ip=$(cut -d "@" -f2 <<< $1) && ssh-keygen -R $ip 2> /dev/null && ssh -o StrictHostKeyChecking=accept-new $1 2> /dev/null} || { ssh $1 }# For Windows users (to add permanent alias to cmd):# Create a file called Alias.bat (preferrably in C:\Bin) # Enter this inside Alias.bat: doskey ssh=bash rotate_ssh_key.sh $1# Add the totate_ssh_keys.sh (This gist) in the same location as Alias.bat# Goto Registry editor# Goto HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor# Add a String valid called Autorun and set the value to the absolute path of Alias.bat# Done.# Windows Alias taken from this post: https://superuser.com/a/238858# For Linux/ Mac Users:# add this to your .bashrc or .zshrc file:# alias ssh="bash /path/to/rotate_ssh_keys.sh"# Done
Пример использования bash script.sh ubuntu@10.10.1.10
Объяснение кода Код принимает имя хоста@ip в качестве аргумента и разбивает его на имя хоста и ip, используя cut команда с @ в качестве разделителя.
Затем он удаляет ip-адрес из файла known_hosts с помощью команды ssh-keygen.
Затем он запускает команду ssh с одной дополнительной опцией -o StrictHostKeyChecking=accept-new. Это позволяет ему автоматически принимать новый ключ.
Я также добавил к нему последовательность try-catch, чтобы в случае ошибок он возвращался к поведению команды ssh по умолчанию.
Ответ Лекенштейна превосходный и правильный, но я просто хотел отметить, что, поскольку ssh ожидает “yes”, а “yes” выводит “y”, вам, возможно, повезло больше с “for h in $SERVER_LIST; do yes yes | ssh $h “uptime”; done” (примечание дополнительное “да”, которое говорит “да”, что нужно сказать вместо “y”).