¿Cómo usar sshpass?


28

Necesito usar sshpasspara iniciar un comando remoto a través de SSH desde un código Java.

Si escribo manualmente en una consola:

ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'

funciona perfectamente, pero pide contraseña. Entonces intenté correr sshpass:

sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'

y ninguno de ellos funciona.

Respuestas:


28

Esto puede ser causado por las comprobaciones de clave de host realizadas por ssh. Parece que sshpasspermanece en silencio en las claves de host no válidas (no hay salida en ninguno stderrni tampoco stdout) y existe con el código de estado 6. En el momento de escribir esto, esta era la revisión 50, y la constante de coincidencia en el código es RETURN_HOST_KEY_UNKNOWN, lo que sugiere ese error.

Su código de error puede diferir y mirar el código vinculado anteriormente puede darle una idea.

Si su problema es una clave de host no válida, debe pensar dos veces antes de anular el error con una opción de CLI. ¡Su máquina podría verse comprometida o podría estar sujeto a un ataque MITM! Si está 100% seguro de que este no es el caso y si no tiene medios para mantener actualizadas las claves de host verificadas, puede usar un comando como este:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

2
Con la instalación de preparación, se necesita un espacio después de -p. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

AVISO: ¡Todos deben recordar que es más seguro usar claves de host SSH sin contraseña siempre que sea posible! Por definición, usar SSHPass es menos seguro.
Questionmark

@Questionmark si bien eso es cierto, hay casos extremos en los que el punto final remoto no admite la autenticación mediante clave. Que es donde sshpass es útil
exhuma

Sí, lo sé. Es por eso que dije "siempre que sea posible" ...
Questionmark

1
Con SSH lo suficientemente nuevo, hay StrictHostKeyChecking=accept-new.
muru

5

sshpasssolo funciona si la solicitud de contraseña termina en assword:.

Si su solicitud de contraseña es diferente, es posible que tenga que ajustar el código fuente de sshpasspara reconocer la solicitud que tiene.

He visto mensajes de contraseña como Password for user@host:en algunos sistemas, quizás este sea tu problema.


1
¿lo siento? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
Esta nueva opción (necesita al menos V1.0.6 de sshpass) resuelve ese problema.
rjs

Oh, lo siento. Este tipo de problema (¿solución?) Ocurre con tanta frecuencia, preguntas antiguas que ya están solucionadas en las nuevas versiones. Gracias.
m3nda

2

Creo que quieres algo como:

sshpass -p yourpassword ssh user@ipaddress somecommand

Por ejemplo, esto funciona para mí:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

¿Configuró inicio de sesión sin contraseña?

Inicios de sesión sin contraseña con OpenSSH http://www.debian-administration.org/articles/152


Prefiero seguir con sshpass, debido a los inconvenientes de habilitar el inicio de sesión sin contraseña en una empresa
Roman Rdgz

¿Intentó esto: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

Lo hice, no importa si uso 'mypass' o mypass. Comienza a esperar para siempre
Roman Rdgz

sshpass -V funciona?
koni_raid

Imprime: "Este programa es software libre y puede distribuirse bajo los términos de la GPL. Consulte el archivo COPIA para obtener más información". Y luego finaliza su ejecución y no hace nada más (intenté agregar -V al comienzo del comando que estaba manejando, no solo escribir sshpass -V)
Roman Rdgz

1

Hay muchas maneras de hacerlo, aquí está mi solución sugerida:

En primer lugar, almacenar su contraseña en una variable es darle comandos más flexibles. sshpasstiene una opción para eso:

-e: esta opción permite leer la contraseña de $SSHPASSla variable de entorno

Tiene dos formas de establecer esta variable:

  1. Establecer directamente en su código:

    export SSHPASS='your_pass'
    
  2. O pídalo:

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    

Que ejecutar su comando;

  1. Si su comando es estático, ejecútelo directamente:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Si su comando será dinámico, use así:

    DYN_FILE_LOC='/media/data/myFavouriteSong.mp3'
    
    eval 'sshpass -e ssh user@host << EOF
    mplayer "$DYN_FILE_LOC"
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF'
    

Espero que esto ayude a alguien.


En su función readPassword, ¿no puede simplemente exportar SSHPASS?
kutschkem

@kutschkem, confío en mi idea de que pienso aquí; no quiero escribir mi pase en un archivo estático, pero en lugar de escribir la contraseña una y otra vez para muchos servidores (7+), escribo una vez :) No tiene que usar la readPasswordfunción, solo puede escribir su contraseña, debería funcionar :) Solo quiero compartir mi código, que muestra un ejemplo usando sshpasscomandos dinámicos: D
veysiertekin

No, solo quiero decir que la evaluación no es necesaria después de la lectura, la exportación no necesita una asignación. ss64.com/bash/export.html
kutschkem

el problema con -e es que la exportación aparecerá en su historial
ejaenv

0

sshpassusa pseudo terminales y la manpágina incluye disculpas por romperse ocasionalmente. También puedes intentarlo fd0ssh. Funciona si no necesita enviar stdina un proceso en la máquina remota. Eso funciona si solo emite un comando y captura el resultado.


0

La sintaxis de sshpass es

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

Tenga en cuenta que no hay espacio entre -p y la contraseña.

También he notado que debe conectarse con ssh al menos una vez manualmente para obtener la clave RSA de la máquina a la que se está conectando, para ~/.ssh/known_hostsacceder al archivo antes de que sshpass le permita conectarse.

así que después de obtener la entrada en el archivo known_hosts puedo ejecutar un comando como

sshpass -ffilename_with_password_in_it ssh user@server uname -a

y ejecutará el comando uname -aen el servidor remoto y enviará los resultados a la salida estándar en la máquina local.


0

Lo que necesitas es -f -t -t -t

sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND

Además, es posible que deba eliminar "requiretty" de sudo config (/ etc / sudoers) en la máquina remota.


0
  1. hacer una llave

    ssh-keygen -t rsa

  2. haga una carpeta .ssh en el servidor remoto, le pedirá una contraseña

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. copiar la clave al servidor remoto

    cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'


Verifique si solicita una contraseña, de lo contrario debería funcionar.

ssh $USER@SEVERNAME 'command'

0

@exhuma tenía un ejemplo que lo llevó a funcionar para mí.

La contraseña debe estar en forma de -pPassword(sin el espacio)

También pueden ser necesarias citas: sshpass -p'Password&0' user@hostname

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.