Альтернатива sshpass в коде оболочки Linux/Bash

Альтернатива sshpass в коде оболочки Linux/Bash

Это стандартные 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:

Связанный контент