15 июля 2020

Автоматическое подключение по ssh из скрипта

При первом подключении к серверу, нужно ответить «yes», что означает — мы доверяем этому серверу. Кроме того, при изменении ключа сервера, надо удалить старый ключ из файла known_hosts. Если аутентификация по ключу в силу каких-то причин невозможна, нужно как-то передать пароль ssh-клиенту. При подключении к серверу из shell-скрипта, нам нужно решить эти три задачи.

Первая задача

Для предотвращения атак «человек посередине» при подключении к серверу, ключ которого ещё не известен ssh-клиенту, будет показан «слепок ключа» (key fingerprint). Нам нужно сравнить этот слепок со слепком ключа сервера, который мы получили по надежному каналу связи. И только после этого ответить «yes» — мы доверяем этому серверу. Выглядит это примерно так:

При утвердительном ответе yes, ssh-клиент продолжит подключение, сохранив ключ сервера в файле ~/.ssh/known_hosts. В противном случае подключение к серверу будет прервано. Чтобы это обойти, нужно добавить опцию StrictHostKeyChecking, которая отключает проверку и сразу добавляет ключ сервера в файл ~/.ssh/known_hosts.

Вторая задача

При попытке подключения после изменения ключа на удаленном сервере (это происходит при переустановке операционной системы или пакета openssh-server), появляется сообщение с ошибкой:

Еще одна причина появления такого сообщения — изменение ip-адреса сервера, потому что ключ в known_hosts хранится в привязке к ip-адресу.

В сообщении можно увидеть, что вторая строка файла ~/.ssh/known_hosts содержит неправильный ключ. И подсказку, как удалить этот ключ (неправильную строку):

Неправильная строка теперь удалена, а исходный файл на всякий случай сохранён под именем known_hosts.old. Еще раз пробуем подключиться:

Но удаление записи в файле known_hosts требует ручного вмешательства, а нам нужно, чтобы подключение к серверу происходило из скрипта, без нашего участия. И здесь на помощь приходит еще одна опция — UserKnownHostsFile. Можно вообще не записывать ключ сервера в файл known_hosts, указав значение этой опции как /dev/null. Тогда и удалять неправильный ключ будет не нужно:

Третья задача

Теперь почти все хорошо, осталось еще решить вопрос с паролем. В этом нам поможет утилита sshpass:

Вот так можно передать пароль ssh-клиенту, чтобы он мог подключиться к серверу:

Также, пароль можно записать в файл, только не забыть выставить для него права:

Опции StrictHostKeyChecking и UserKnownHostsFile могут быть заданы постоянно в ~/.ssh/config (для текущего пользователя) или в /etc/ssh/ssh_config (для всех пользователей).

Теперь подключаться к серверу 123.123.123.123 можно так:

Но тут надо учитывать, от имени какого пользователя будет запускаться скрипт. Например, если скрипт запускается от root, то и файл конфигурации должен быть размещен в /root/.ssh/config. Иначе нужно явно указать, где расположен файл с настройками ssh-клиента:

спасибо сайту https://tokmakov.msk.ru/blog/item/512

Метки:

Опубликовано 15.07.2020 от evgeniyalf в категории "Linux