Comment utiliser sshpass?

28

Je dois utiliser sshpasspour 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 courir 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'eux ne fonctionne.

Roman Rdgz
la source

Réponses:

28

Cela peut être dû aux vérifications de clé d'hôte effectuées par ssh. Il ressemble à sshpassgarder le silence sur les clés hôtes invalides (pas de sortie sur ni stderrni stdout) et existe avec le code d'état 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 indique cette erreur.

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

Si votre problème est une clé d'hôte non valide, vous devriez réfléchir à deux fois avant de remplacer l'erreur avec 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 aucun moyen de maintenir à jour les clés d'hôte vérifiées, vous pouvez utiliser une commande comme celle-ci:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
exhuma
la source
2
Avec l'installation de l'infusion, un espace est nécessaire après -p. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile
AVIS: Tout le monde doit se rappeler qu'il est plus sûr d'utiliser les clés d'hôte SSH sans mot de passe chaque fois que possible! Par définition, l'utilisation de SSHPass est moins sécurisée.
Questionmark
@Questionmark bien que cela soit vrai, il existe des cas limites où le point de terminaison distant ne prend pas en charge l'authentification via la clé. C'est là que sshpass est utile
exhuma
Oui je sais. C'est pourquoi j'ai dit "chaque fois que possible" ...
Questionmark
1
Avec suffisamment de SSH, il y en a StrictHostKeyChecking=accept-new.
muru
5

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

Si l'invite de votre 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.

rjs
la source
1
Désolé? -P prompt Which string should sshpass search for to detect a password prompt
m3nda
2
Cette nouvelle option (nécessite au moins V1.0.6 de sshpass) résout ce problème.
rjs
Oh pardon. Ce genre de problème (solution?) Se produit si souvent, d'anciennes questions qui sont déjà corrigées dans les nouvelles versions. Merci.
m3nda
2

Je pense que vous voulez quelque chose comme:

sshpass -p yourpassword ssh user@ipaddress somecommand

Par exemple, cela fonctionne pour moi:

sshpass -p mypassword ssh [email protected] touch foo
benofben
la source
1

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

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

koni_raid
la source
Je préfère m'en tenir à sshpass, en raison des inconvénients de l'activation de la connexion sans mot de passe dans une entreprise
Roman Rdgz
Avez-vous essayé ceci: sshpass -p 'mypass' ssh [email protected]
koni_raid
Je l'ai fait, peu importe si j'utilise «mypass» ou mypass. Ça commence à attendre pour toujours
Roman Rdgz
sshpass -V fonctionne?
koni_raid
Il imprime: "Ce programme est un logiciel libre, et peut être distribué sous les termes de la GPL. Voir le fichier COPYING pour plus d'informations". Et puis termine son exécution et ne fait rien d'autre (j'ai essayé d'ajouter -V au début de la commande que je manipulais, pas seulement de taper sshpass -V)
Roman Rdgz
1

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

Tout d'abord, le stockage de votre mot de passe dans une variable vous donne des commandes plus flexibles. sshpassa une option pour cela:

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

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

  1. Définissez 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 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'
    

j'espère que cela aide quelqu'un.

veysiertekin
la source
Dans votre fonction readPassword, ne pouvez-vous pas simplement exporter SSHPASS?
kutschkem
@kutschkem, je fais confiance mais mon idée que je pense ici; je ne veux pas écrire mon pass dans un fichier statique mais au lieu d'écrire le mot de passe encore et encore pour beaucoup de serveurs (7+), j'écris une fois :) Vous n'avez pas besoin d'utiliser la readPasswordfonction, vous pouvez simplement écrire votre mot de passe, il devrait fonctionner :) Je veux seulement partager mon code qui montre un exemple en utilisant sshpassdes commandes dynamiques: D
veysiertekin
Non, je veux juste dire que l'évaluation n'est pas nécessaire après la lecture, l'exportation n'a pas besoin d'une affectation. ss64.com/bash/export.html
kutschkem
le problème avec -e est que l'exportation sera répertoriée dans votre historique
ejaenv
0

sshpassutilise des pseudo-terminaux et la manpage comprend des excuses pour les coupures occasionnelles. Vous pouvez également essayer fd0ssh. Cela fonctionne si vous n'avez pas besoin d'envoyer stdinà un processus sur la machine distante. Cela fonctionne si vous émettez simplement une commande et capturez le résultat.

Bruce
la source
0

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.

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, pour accéder au ~/.ssh/known_hostsfichier avant que sshpass vous permette de 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 -asur le serveur distant et restituera les résultats à la norme sur la machine locale.

BeowulfNode42
la source
0

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

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

De plus, vous devrez peut-être supprimer "require" de la configuration sudo (/ etc / sudoers) sur la machine distante.

Ehsan
la source
0
  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 s'il demande un mot de passe, sinon cela devrait fonctionner.

ssh $USER@SEVERNAME 'command'
VeggieVampire
la source
0

@exhuma avait un exemple qui l'a amené à fonctionner pour moi.

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

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

user3367115
la source