alternativa sshpass no código shell/bash do Linux

alternativa sshpass no código shell/bash do Linux

Estes são sshpasscomandos 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 expectnão estiver disponível?

Public/privatekey não é a opção neste caso.

Se houver código disponível para fornecer a mesma funcionalidade que sshpassexiste, 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 sshirá 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, expectetc, resolvam isso esperando para sshescrever 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 echopode 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:

informação relacionada