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.
Cela peut être dû aux vérifications de clé d'hôte effectuées par ssh
name__. Il semble que sshpass
garde le silence sur les clés d’hôte invalides (aucune sortie sur stderr
et stdout
name__) 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
sshpass
ne 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 sshpass
pour 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.
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
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:
Placez directement dans votre code:
export SSHPASS='your_pass'
Ou demandez-le:
readPassword () {
echo Ssh Password:
read -s SSHPASS
eval "export SSHPASS='""$SSHPASS""'"
}
# read password
readPassword
Qu'exécuter votre commande;
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
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.
Avez-vous configuré une connexion sans mot de passe?
Connexions sans mot de passe avec OpenSSH http://www.debian-administration.org/articles/152
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.
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.
@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
faire une clé
ssh-keygen -t rsa
créer un dossier .ssh sur le serveur distant, il vous demandera un mot de passe
ssh $USER@SEVERNAME mkdir -p .ssh
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'
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.