
Estes são sshpass
comandos padrão para ler a senha do arquivo ou como argumento.
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
É possível escrever o mesmo programa/script em shell se expect
não estiver disponível?
Public/private
key não é a opção neste caso.
Se houver código disponível para fornecer a mesma funcionalidade que sshpass
existe, por favor me avise.
Quanto mais simples o código, melhor.
Responder1
Você pode script(1)
, como uma pequena expectativa, desde que consiga lidar com o ajuste de tempos limite arbitrários, o que é obviamente bastante complicado:
{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'
ou com a sintaxe do BSD script(1)
:
{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD
Isso sleep
é necessário porque ssh
irá drenar o buffer de entrada do tty (e descartar tudo o que já foi gravado nele) antes de ler a senha. Se o servidor remoto foràs vezeslento para responder, usar um tempo limite "grande o suficiente" pode ser impraticável.
sshpass
, expect
etc, resolvam isso esperando para ssh
escrever o ... password:
prompt antes de escrever a senha no final mestre do pty. Fazer isso a partir de um shell padrão não é simples nem muito robusto. Aqui está um truque usando um pipe nomeado:
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'
Claro, isso não é muito seguro, especialmente porque echo
pode não ser um shell embutido. Para qualquer uso não interativo de ssh,usar autenticação de chave pública.
Responder2
Acabei de encontrar um script bash incrível que implementa sshpass no bash puro: