38 votes

Comment utiliser sshpass ?

J'ai besoin d'utiliser sshpass pour lancer une commande à distance via SSH à partir d'un code Java.

Si je tape manuellement dans une console :

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

fonctionne parfaitement, mais demande un mot de passe. J'ai donc essayé d'exécuter 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'

et aucun d'entre eux ne fonctionne.

40voto

exhuma Points 682

Cela peut être causé par les vérifications de la clé de l'hôte faites par ssh . On dirait que sshpass reste silencieux sur les clés d'hôtes invalides (pas de sortie sur aucun des deux) stderr ni stdout ) et existe avec le code de statut 6 . Au moment de la rédaction de ce document, il s'agissait de la révision 50, et la constante correspondante dans le code est la suivante RETURN_HOST_KEY_UNKNOWN qui fait allusion à cette erreur.

Votre code d'erreur peut être différent et l'examen du code lié ci-dessus peut vous donner un aperçu.

Si si votre problème est une clé d'hôte invalide, vous devriez réfléchir à deux fois avant de remplacer l'erreur par une option CLI. Votre machine pourrait être compromise ou vous pourriez être victime d'une attaque MITM ! Si vous êtes 100% certain que ce n'est pas le cas et si vous n'avez aucun moyen de maintenir à jour les clés d'hôtes vérifiées, vous pouvez utiliser une commande comme celle-ci :

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

11voto

rjs Points 111

sshpass La commande fonctionne uniquement si l'invite de mot de passe se termine par assword: .

Si votre demande de mot de passe est différente, vous devrez peut-être ajuster le code source de l'outil de gestion des mots de passe. sshpass pour reconnaître l'incitation que vous avez.

J'ai vu des invites de mot de passe comme Password for user@host: sur certains systèmes, c'est peut-être là votre problème.

4voto

MrGlass Points 3374

Je pense que tu veux quelque chose comme :

sshpass -p yourpassword ssh user@ipaddress somecommand

Par exemple, ceci fonctionne pour moi :

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1voto

BeowulfNode42 Points 580

La syntaxe de sshpass est

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

Notez qu'il n'y a pas d'espace entre le -p et le mot de passe.

J'ai également remarqué que vous devez vous connecter avec ssh au moins une fois manuellement pour obtenir la clé RSA de la machine à laquelle vous vous connectez, afin d'entrer dans l'espace de stockage de la clé. ~/.ssh/known_hosts avant que sshpass ne vous permette de vous connecter.

Ainsi, après avoir obtenu l'entrée dans le fichier known_hosts, je peux exécuter une commande telle que

sshpass -ffilename_with_password_in_it ssh user@server uname -a

et il exécutera la commande uname -a sur le serveur distant et sortir les résultats sur la sortie standard de la machine locale.

1voto

veysiertekin Points 111

Il existe de nombreuses façons de le faire, voici la solution que je propose :

Tout d'abord, stocker votre mot de passe dans une variable est de vous donner des commandes plus flexibles. sshpass a une option pour cela :

-e cette option permet de lire le mot de passe à partir de $SSHPASS variable d'environnement

Vous avez deux façons de définir cette variable :

  1. Défini directement dans votre code :

    export SSHPASS='your_pass'
  2. Ou demandez-le :

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

Ensuite, exécutez votre commande ;

  1. Si votre commande est statique, exécutez-la directement :

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
  2. Si votre commande est dynamique, utilisez comme ceci :

    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'

J'espère que cela aidera quelqu'un.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X