¿Cómo usar sshpass?

22

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

Si ingreso manualmente una consola:

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

funciona a la perfección, pero pide una contraseña. Así que traté de ejecutar 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.

    
pregunta Roman Rdgz 17.04.2013 - 08:43

10 respuestas

21

Tengo un comando como este:

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

y funciona.

En mi caso, StrictHostKeyChecking=no es necesario porque los comandos se ejecutan en una tonelada de hosts que se intercambian regularmente (enrutadores de red).

Por curiosidad, traté de ejecutarlo sin la orden, solo para ver qué estaba pasando. Resulta que sshpass se mantiene en silencio (sin salida en stderr ). Pero el código de retorno en ese caso es 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 cual tiene sentido.

¿Tal vez ese sea el mismo problema en tu caso?

Si ese no es el caso, ¿ha citado correctamente el comando remoto?

    
respondido por el exhuma 04.12.2013 - 09:23
4

sshpass solo funciona si la solicitud de contraseña finaliza en assword: .

Si su solicitud de contraseña es diferente, puede que tenga que ajustar el código fuente de sshpass para reconocer el mensaje que tiene.

He visto solicitudes de contraseña como Password for user@host: en algunos sistemas, tal vez este es tu problema.

    
respondido por el rjs 14.07.2014 - 11:45
1

¿Ha configurado un inicio de sesión sin contraseña?

inicios de sesión sin contraseña con OpenSSH enlace

    
respondido por el koni_raid 17.04.2013 - 08:52
1

Hay muchas formas de hacerlo, esta es mi solución sugerida:

Antes que nada, almacenar tu contraseña en una variable te da comandos más flexibles. sshpass tiene una opción para eso:

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

Tiene dos formas de establecer esta variable:

  1. Establezca 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
    

Luego ejecuta tu 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.

    
respondido por el veysiertekin 27.03.2015 - 13:59
1

Creo que quieres algo como:

ssh -p yourpassword ssh user@ipaddress somecommand

Por ejemplo, esto funciona para mí:

sshpass -p mypassword ssh username@10.0.0.9 touch foo
    
respondido por el benofben 07.02.2016 - 06:27
0

sshpass usa pseudo terminales y la página man incluye disculpas por romper ocasionalmente. También puedes probar fd0ssh . Funciona si no necesita enviar stdin a un proceso en la máquina remota. Eso funciona si solo emite un comando y captura el resultado.

    
respondido por el Bruce 26.07.2013 - 15:44
0

la sintaxis de sshpass es

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

Tenga en cuenta que no hay espacio entre la -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 ingresar al archivo ~/.ssh/known_hosts antes de que sshpass le permita conectarse.

luego 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 -a en el servidor remoto y enviará los resultados a la salida estándar en la máquina local.

    
respondido por el BeowulfNode42 15.05.2014 - 06:16
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 tengas que eliminar "requiretty" de sudo config (/ etc / sudoers) en la máquina remota.

    
respondido por el Ehsan 26.05.2014 - 19:27
0
  1. crear una clave

    ssh-keygen -t rsa

  2. crea una carpeta .ssh en el servidor remoto y te pedirá una contraseña

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. copia la clave del servidor remoto

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

Compruebe si solicita una contraseña, si no debería funcionar.

ssh $USER@SEVERNAME 'command'
    
respondido por el VeggieVampire 08.06.2015 - 11:48
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 comillas: sshpass -p'Password&0' user@hostname

    
respondido por el user3367115 28.09.2015 - 23:52

Lea otras preguntas en las etiquetas