Передайте пароль в ssh в чистом bash
Я хочу передать пароль ssh
с помощью bash script (Да, я знаю, что есть ключи ssh, которые я мог бы использовать, но это не то, что я намереваюсь).
Я нашел несколько решений, которые использовали expect
, но поскольку он не является стандартным инструментом bash, мне интересно, могу ли я сделать это с помощью труб.
Может кто-нибудь объяснить мне, почему именно что-то вроде этого:
echo "password\n" | ssh somehost.com
или
ssh somehost.com <(echo "password\n")
не работает? Есть ли возможность заставить его работать? Возможно, выполнив ssh
как другой процесс, получив его PID, а затем отправив строку прямо к нему?
Ответы
Ответ 1
Поскольку не было никаких точных ответов на мой вопрос, я провел некоторое расследование, почему мой код не работает, когда есть другие решения, которые работают, и решил опубликовать то, что я нашел, чтобы завершить тему.
Как оказалось:
"ssh использует прямой доступ TTY, чтобы убедиться, что пароль действительно выпущенном пользователем интерактивной клавиатуры. sshpass manpage
который отвечает на вопрос, почему в этом случае трубы не работают. Очевидным решением было создание условий, чтобы ssh
"думал", что он запускается в регулярном терминале, и поскольку это может быть выполнено с помощью простых функций posix
, это выходит за рамки простого bash
.
Ответ 2
Вы не можете указать пароль из командной строки, но вы можете использовать либо ssh-ключи, либо используя sshpass
, как предложено John C. или с помощью expect
script.
Чтобы использовать sshpass, вам нужно сначала установить его. Тогда
sshpass -f <(printf '%s\n' your_password) ssh [email protected]
вместо sshpass -p your_password
. Как упоминалось в комментариях Charles Duffy
, безопаснее предоставлять пароль из файла или из переменной, а не из командной строки.
BTW, небольшое объяснение синтаксиса <(command)
. Оболочка выполняет команду в круглых скобках и заменяет все это файловым дескриптором, который связан с командой stdout. Вы можете найти больше из этого ответа https://unix.stackexchange.com/info/156084/why-does-process-substitution-result-in-a-file-called-dev-fd-63-which-is-a-pipe