SSH-подключение в Bash-скрипте

Обычное подключение по SSH требует ввода логина и пароля, но что если нам требуется организовать такое подключение в скрипте для командного интерпретатора Bash. Есть несколько способов.

Способ 1. Аутентификация на базе ключей SSH

Самый грамотный способ любого SSH-подключения, не важно это скрипт или просто последовательность команд в консоли, это генерация пары ключей на рабочей станции с последующей передачей открытого ключа на удаленный сервер (сервер — как вариант).

ssh-keygen -t rsa

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

ssh-copy-id -i ~/.ssh/id_rsa.pub username@192.168.0.25

Где username — это логин вашего пользователя на сервере, 192.168.0.25 — IP-адрес этой машины. В результате в ~/.ssh/autorized_keys на сервере должны появится дополнительные ключи. При первом подключении потребуется дать разрешение для неизвестного источника подключения, попросту ввести «yes», и лучше это сделать вручную через консоль. С этого момента подключиться к этому серверу можно простой командой:

ssh username@192.168.0.25 "uptime && free -m"

В кавычках могут быть любые другие команды вместо uptime && free -m (это просто как пример).

А если системный пользователь рабочей станции у вас совпадает с серверным, то подойдет и команда без использования логина:

ssh 192.168.0.25 "uptime && free -m"

Способ 2. Аутентификация с помощью команды SSHPass

Бывают ситуации, где нам в любом случае необходимо использовать авторизацию по паролю, и тут поможет утилита SSHPass, которая скорее всего будет в любом репозитории и устанавливается стандартно.

sshpass -p {ВАШ ПАРОЛЬ} ssh username@192.168.0.25 "uptime && free -m"

Способ 3. Аутентификация с помощью интерпретатора Expect

Самый замороченный способ с помощью альтернативного интерпретатора Expect, где он у вас расположен можно понять после ввода команды which expect. Если необходимо его установить, то делается это стандартно.

ЧИТАЙТЕ ТАКЖЕ:  Консольные пакетные менеджеры в системе macOS

Прежде всего в скрипте нужно подключить новый интерпретатор:

подключение интерпретатора expect

Такой код актуален, если Bash и Expect у ваc лежат в каталоге системных приложений /bin, но это может быть и /usr/bin. Эта тема затрагивается в моей статье про обновление командного интерпретатора в macOS, можно почитать про альтернативные места установки.

Можно использовать Expect в скрипте и напрямую:

/usr/bin/expect -c 'spawn ssh username@192.168.0.25 "uptime && free -m"
expect "Password:" { send "ВАШ ПАРОЛЬ" }'
kupereal