Alternativa a sshpass en código shell/bash de Linux

Alternativa a sshpass en código shell/bash de Linux

Estos son comandos estándar sshpasspara 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 expectno está disponible?

Public/privateLa clave no es la opción en este caso.

Si hay código disponible para proporcionar la misma funcionalidad que sshpassexiste, 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 sleepes necesario porque sshagotará 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, expectetc. manejan eso esperando sshescribir 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 echoes 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:

información relacionada