Как использовать автоввод пароля при SSH-авторизации в задачах автоматизации

Авторизация по SSH ключу

Здесь рассмотрен случай, если вам нужен автоввод пароля SSH-ключа в скриптах автоматизации, в том случае, если вы используете только аутентификацию по ключу: (PasswordAuthentcation off; PubkeyAuthentication yes) в конфиге /etc/ssh/sshd_config.
Конечно, применение ключа SSH для авторизации является приоритетным вариантом - он более безопасен хотя-бы уже потому, что исключает возможность и попытки подбора пароля злоумышленниками (bruteforce). В простейшем варианте, можно использовать SSH-ключ не защищенный паролем. Но если речь идет об узле автоматизации, где один пароль может быть использован для доступа к множеству хостов - то компроментация такого узла или утечка приватоного ключа приводит к тому, что все подконтрольные хосту будут доступны хакеру. Это может быть, например, узел управления ansible. Но, как известно, ansible CLI не может работать с запароленным SSH-ключом.
Самый очевидный вариант, в данном случае, использовать ssh-agent. Запускаем ssh-agent:

eval $(ssh-agent -s)
Подгружаем в него нужный запароленный приватный ключ:
ssh-add ~/.ssh/private.key

Далее, однократно вводим пароль ключа и запуск ansible-команд или других будет работать со всеми серверами до того момента, как вы выйдете из ssh-сессии или выгрузите ключи из памяти агента:

ssh-agent -k

Авторизация по паролю

Как уже говорилось ранее, безопаснее при автоматизации доступа использовать ssh-ключ, но иногда возникает необходимость использования именно парольной аутентификации.
(PasswordAuthentcation on) в конфиге /etc/ssh/sshd_config.

sshpass

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

apt-get install sshpass
Теперь можно войти на сервер:

sshpass -p "MySecretPass" ssh -o StrictHostKeyChecking=no username@server
Или так:

sshpass -p "MySecretPass" autossh -M0 -t myusername@myserver

Использовать нестандартный порт:

sshpass -p "MySecretPass" ssh -o StrictHostKeyChecking=no username@server:2400

expect

#!/usr/bin/expect -f
spawn ssh username@server "touch /home/user/ssh_example"
expect "Password:"
send "PASSWORD\r"
interact

С запросом пароля

#!/bin/sh
read -s -p "Введите пароль: " SSHPASS 
export SSHPASS
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@"
unset SSHPASS

Пример с алиасом

Можно логиниться к серверу, используя алиас.
Для начала, создадим скрипт /usr/local/bin/ssh_script.sh со следующим содержимым:

#!/bin/bash
sshpass -p mypassword ssh root@$1
Затем, пропишем скрипт в алис, и входим без ввода пароля:

echo -e "alias ssp='/usr/local/bin/ssh_script.sh'" >> ~/.bashrc
source ~/.bashrc
ssp <server_ip>

Пароль из файла

echo "echo YourPasswordHere" > /tmp/.ssh_pass
export SSH_ASKPASS="/tmp/.ssh_pass"
export DISPLAY=YOURDOINGITWRONG
setsid ssh root@owned.com -p 22

Обновлено: 01.02.2026