
Estos son comandos estándar sshpass
para leer la contraseña de un archivo o como argumento.
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
¿Es posible escribir el mismo programa/script en Shell si expect
no está disponible?
Public/private
La clave no es la opción en este caso.
Si hay código disponible para proporcionar la misma funcionalidad que sshpass
existe, hágamelo saber.
Cuanto más simple sea el código, mejor.
Respuesta1
Como mini-espera, puede hacerlo script(1)
, siempre que pueda hacer frente al ajuste de tiempos de espera arbitrarios, lo cual, por supuesto, es bastante complicado:
{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'
o con la sintaxis de BSD script(1)
:
{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD
Esto sleep
es necesario porque ssh
agotará el búfer de entrada del tty (y descartará todo lo que ya esté escrito en él) antes de leer la contraseña. Si el servidor remoto esa veceslento para responder, utilizar un tiempo de espera "suficientemente grande" puede resultar poco práctico.
sshpass
, expect
etc. manejan eso esperando ssh
escribir el ... password:
mensaje antes de escribir la contraseña en el extremo maestro del pty. Hacer eso desde un shell estándar no es simple ni muy robusto. Aquí hay un error usando una tubería con nombre:
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'
Por supuesto, esto no es muy seguro, especialmente porque echo
es posible que no esté integrado en el shell. Para cualquier uso no interactivo de ssh,utilizar autenticación de clave pública.
Respuesta2
Acabo de encontrar un increíble script bash que implementa sshpass en bash puro: