Ssh: автоматическое принятие ключей

Я написал этот небольшой служебный скрипт:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Когда новый сервер добавляется в $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 чтобы автоматически принимать любой новый ключ?

Используйте опцию StrictHostKeyChecking, например:

ssh -oStrictHostKeyChecking=no $h uptime

Эта опция также может быть добавлена в ~/.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.

Вы можете использовать следующую команду, чтобы добавить отпечаток пальца для сервера в свои known_hosts

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hostsssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

записка:>> Замените < ip-адрес и < имя хоста на IP и dns-имя сервера, который вы хотите добавить.

Единственная проблема с этим заключается в том, что в конечном итоге вы дважды столкнетесь с некоторыми серверами в ваших known_hosts. На самом деле в этом нет ничего особенного, просто упоминание. Чтобы убедиться в отсутствии дубликатов, вы можете сначала удалить все серверы, выполнив сначала следующее:

ssh-keygen -R <ip-address>ssh-keygen -R <hostname>

Чтобы ты мог убежать:

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

Отключение проверки работоспособности для удобства звучит как плохой план, даже если вы думаете, что полностью контролируете окружающую среду.

Добавьте эту запись в ~/.ssh/config файл

Host *    StrictHostKeyChecking no

Если он жалуется на разрешение доступа для ~/.ssh/config, затем попробуйте

$ chmod 644 ~/.ssh/config

Чтобы автоматически добавить список серверов, мы можем сделать следующее:

Добавить IP-адреса серверов в список файловых серверов

IP-адреса должны быть добавлены в приведенном ниже формате.

Выход из cat servers-list

123.1.2.3124.1.2.4123.1.2.5

Измените вышеуказанные IP-адреса, заменив свой.

Приведенная ниже команда добавит все серверы из списка.

ssh-keyscan -H "`cat servers-list`" >> ~/.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”).