Подтвердить что ты не робот

Передайте пароль в ssh в чистом bash

Я хочу передать пароль ssh с помощью bash script (Да, я знаю, что есть ключи ssh, которые я мог бы использовать, но это не то, что я намереваюсь).

Я нашел несколько решений, которые использовали expect, но поскольку он не является стандартным инструментом bash, мне интересно, могу ли я сделать это с помощью труб.

Может кто-нибудь объяснить мне, почему именно что-то вроде этого:

echo "password\n" | ssh somehost.com

или

ssh somehost.com <(echo "password\n")

не работает? Есть ли возможность заставить его работать? Возможно, выполнив ssh как другой процесс, получив его PID, а затем отправив строку прямо к нему?

4b9b3361

Ответ 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