
Это стандартные sshpass
команды для чтения пароля из файла или в качестве аргумента.
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
Можно ли написать ту же программу/скрипт в оболочке, если она expect
недоступна?
Public/private
В данном случае ключ не является вариантом.
Если существует доступный код, обеспечивающий ту же функциональность, что и sshpass
там, пожалуйста, дайте мне знать.
Чем проще код, тем лучше.
решение1
Вы можете сделать это script(1)
в качестве мини-ожидания, при условии, что вы можете справиться с настройкой произвольных тайм-аутов, что, конечно, довольно запутанно:
{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'
или с синтаксисом BSD script(1)
:
{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD
Это sleep
необходимо, поскольку ssh
опустошит входной буфер tty (и отменит все, что уже было записано в него) перед чтением пароля. Если удаленный сервериногдамедленно реагирует, использование «достаточно большого» тайм-аута может быть непрактичным.
sshpass
и т. д . expect
обрабатывают это, ожидая, чтобы ssh
записать ... password:
приглашение, прежде чем они запишут пароль в главный конец pty. Сделать это из стандартной оболочки не просто и не очень надежно. Вот кладж с использованием именованного канала:
passwdcmd(){
t=$(mktemp -u); mkfifo "$t" || return
script /dev/null -qc "$2" <>"$t" | { dd count=1 2>/dev/null; echo "$1" >"$t"; rm "$t"; cat; }
}
passwdcmd PASSWD 'ssh user@host CMD'
Конечно, это не очень безопасно, особенно потому, что echo
может не быть встроенной оболочкой. Для любого неинтерактивного использования ssh,использовать аутентификацию с открытым ключом.
решение2
Только что нашел потрясающий скрипт bash, который реализует sshpass на чистом bash: