web-dev-qa-db-fra.com

Comment utiliser sshpass?

Je dois 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é de lancer 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.

27
Roman Rdgz

Cela peut être dû aux vérifications de clé d'hôte effectuées par sshname__. Il semble que sshpassgarde le silence sur les clés d’hôte invalides (aucune sortie sur stderret stdoutname__) et existe avec le code de statut 6. Au moment d'écrire ces lignes, il s'agissait de la révision 50 et la constante de correspondance dans le code est RETURN_Host_KEY_UNKNOWN , ce qui suggère une erreur.

Votre code d'erreur peut différer et consulter le code lié ci-dessus peut vous donner un aperçu.

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

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@Host command_to_run
27
exhuma

sshpassne fonctionne que si l'invite de mot de passe se termine par assword:.

Si votre invite de mot de passe est différente, vous devrez peut-être ajuster le code source de sshpasspour reconnaître l'invite 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 votre problème.

4
rjs

Je pense que tu veux quelque chose comme:

sshpass -p yourpassword ssh user@ipaddress somecommand

Par exemple, cela fonctionne pour moi:

sshpass -p mypassword ssh [email protected] touch foo
2
benofben

Il y a beaucoup de façons de faire cela, voici la solution suggérée:

Tout d’abord, stocker votre mot de passe dans une variable vous donnera des commandes plus souples. sshpass a une option pour cela:

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

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

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

Qu'exécuter votre commande;

  1. Si votre commande est statique, lancez-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 sera 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'
    

espérons que cela aide quelqu'un.

1
veysiertekin

Avez-vous configuré une connexion sans mot de passe?

Connexions sans mot de passe avec OpenSSH http://www.debian-administration.org/articles/152

1
koni_raid

Ce dont vous avez besoin est -f -t -t -t

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

De plus, vous devrez peut-être supprimer "requiretty" de Sudo config (/ etc/sudoers) sur la machine distante.

0
Ehsan

sshpass utilise des pseudo-terminaux et la page man contient des excuses pour la rupture occasionnelle. Vous pouvez également essayer fd0ssh. Cela fonctionne si vous n'avez pas besoin d'envoyer stdin à un processus de la machine distante. Cela fonctionne si vous émettez simplement une commande et capturez le résultat.

0
Bruce

@exhuma a eu un exemple qui l'a conduit à fonctionner pour moi.

Le mot de passe doit être sous la forme -pPassword (sans espace)

des guillemets peuvent également être nécessaires: sshpass -p'Password&0' user@hostname

0
user3367115
  1. faire une clé

    ssh-keygen -t rsa

  2. créer un dossier .ssh sur le serveur distant, il vous demandera un mot de passe

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. copier la clé sur le serveur distant

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


Vérifiez si elle demande un mot de passe, sinon cela devrait fonctionner.

ssh $USER@SEVERNAME 'command'
0
VeggieVampire

la syntaxe 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.

De plus, j'ai remarqué que vous devez vous connecter au moins une fois avec ssh manuellement pour obtenir la clé RSA de la machine à laquelle vous vous connectez, pour aller dans le fichier ~/.ssh/known_hosts avant que sshpass vous autorise à vous connecter.

donc 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 affichera les résultats dans la sortie standard de la machine locale.

0
BeowulfNode42