parallel-ssh avec clé SSH protégée par mot de passe

8

Je souhaite utiliser ma clé SSH protégée par mot de passe lorsque vous effectuez des tâches avec parallel-ssh(et les outils associés). Cependant, je ne peux pas faire fonctionner cela.

Toute la documentation, concernant parallel-ssh, montre que je devrais pouvoir utiliser --askpassou -Afaire ceci:

-A
--askpass
      Prompt  for  a  password  and pass it to ssh.  The password may be 
      used for either to unlock a key or for password authentication.  The 
      password is transferred in a fairly secure manner (e.g., it will not 
      show up in argument lists).  However, be aware that a root user on 
      your system could potentially intercept the password.

Cependant, lorsque j'entre la phrase secrète de ma clé, cela ne fonctionne pas:

$ parallel-ssh --hosts=machines --user=my_user --askpass \
    --timeout=0 --inline -v 'sudo apt-get update'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 09:59:36 [FAILURE] amritiii Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[2] 09:59:37 [FAILURE] gbdev Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[3] 09:59:37 [FAILURE] code Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[4] 09:59:37 [FAILURE] apollo Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[5] 09:59:37 [FAILURE] odin Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[6] 09:59:37 [FAILURE] hathor Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[7] 09:59:37 [FAILURE] ldap Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[8] 09:59:37 [FAILURE] thor Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[9] 09:59:37 [FAILURE] bioserver Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).

J'ai confirmé que ma clé SSH et ma phrase de passe fonctionnent sur chacune des machines, donc je n'ai aucune idée de comment faire fonctionner cela.

Nathan S. Watson-Haigh
la source
Je suppose que parallel-ssh est le même que pssh?
slm
Oui, parallel-sshet psshsont en effet les mêmes.
Nathan S. Watson-Haigh

Réponses:

5

En supposant que parallel-sshet psshsont équivalents, alors oui, ce que vous essayez de faire devrait fonctionner très bien avec le passage de la phrase de passe lors de l'utilisation du -Acommutateur.

Exemple

Voici un exemple où je me connecte à 2 systèmes différents, host1et host2. J'utilise le -lcommutateur pour psshfournir un utilisateur par défaut à root. Cependant, host2je remplace cela dans le -Hcommutateur en spécifiant le nom d'hôte comme user1@host2.

$ pssh -A -i -H "host1 user1@host2" -l root 'echo "hi"'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 21:38:00 [SUCCESS] user1@host2
hi
Stderr: 
This is a private site.  Unauthorized connections are prohibited.  
All activity may be logged.  Disconnect immediately if you object to 
this policy or are not an authorized user.

X11 forwarding request failed on channel 1
Killed by signal 1.
[2] 21:38:00 [SUCCESS] host1
hi
Stderr: 
This is a private site.  Unauthorized connections are prohibited.  
All activity may be logged.  Disconnect immediately if you object to 
this policy or are not an authorized user.

ControlSocket /home/user1/.ssh/[email protected]:22 already exists, disabling multiplexing
X11 forwarding request failed on channel 0
Killed by signal 1.

Lorsque les travaux ci - dessus , vous remarquerez la sortie de la commande que je cours, echo "hi".

Votre problème

Le problème que vous rencontrez avec une phrase secrète sur votre paire de clés SSH est dû à un bogue. Voici le bogue intitulé: Problème 80: Vous ne passez pas la phrase secrète? . Le 4ème commentaire de ce problème montre un patch:

extrait

# 4 robine ... @ gmail.com

J'ai changé la ligne en

  if not ( prompt.strip().lower().endswith('password:') or 
        'enter passphrase for key' in prompt.strip().lower()):

et ça semble marcher

Références

slm
la source
Merci pour votre entrée slm. parallel-sshet psshsont en effet les mêmes. Je ne demandais pas si c'était possible - la documentation indique clairement que c'est possible. J'ai du mal à le faire fonctionner car il est documenté.
Nathan S. Watson-Haigh
1
@ NathanS.Watson-Haigh - voir la mise à jour. C'est un bug, j'ai refé le patch.
slm
C'est en effet la question qui m'affecte. Cependant, comme les auteurs de parallel-sshne savent toujours pas comment détecter au mieux la question d'invite de mot de passe et donc répondre avec le mot de passe / la phrase entré, je vais m'en tenir à ma méthode de trousseau. Je ne voudrais pas que ma phrase secrète soit révélée par inadvertance à la mauvaise invite de questions.
Nathan S. Watson-Haigh
1
J'accepterai cela comme la réponse car vous avez réussi à comprendre qu'il s'agissait d'un bogue connu dans la façon de parallel-sshtransmettre la phrase secrète à SSH. Cependant, pour ceux qui rencontreront cette question à l'avenir, ce bogue peut avoir été corrigé ou vous pouvez choisir de ne pas modifier le askpass_client.pyfichier. Dans les deux cas, vous pouvez contourner ce problème en utilisant la keychainréponse ( unix.stackexchange.com/a/128998/57414 ) ou la réponse ssh-agent ( unix.stackexchange.com/a/129022/57414 )
Nathan S. Watson- Haigh
5

J'ai réussi à faire fonctionner cela en installant keychainplutôt qu'en corrigeant manuellement le bogue à l'origine de mes problèmes.

Installer et exécuter manuellement le trousseau

# install keychain package
$ sudo apt-get install keychain

# add my key to the keychain, entering passphrase when asked
$ keychain ~/.ssh/id_rsa

# source the file generated by the above command
$ . ~/.keychain/$(uname -n)-sh

Exécuter la commande sans entrée de mot de passe / phrase de passe

Maintenant, cette fois, je n'ai pas besoin de ma phrase secrète lors de l'appel parallel-sshcar le trousseau se charge de l'authentification:

$ parallel-ssh --hosts=machines --user=my_user --timeout=0 'sudo apt-get update'
[1] 14:52:15 [SUCCESS] amritiii 
[2] 14:52:17 [SUCCESS] odin
[3] 14:52:25 [SUCCESS] gmod
[4] 14:53:11 [SUCCESS] bioserver
[5] 14:53:14 [SUCCESS] thor
[6] 14:53:14 [SUCCESS] apollo
[7] 14:53:16 [SUCCESS] gbdev
[8] 14:53:17 [SUCCESS] code
[9] 14:53:18 [SUCCESS] hathor
[10] 14:53:34 [SUCCESS] ldap

Exécuter le trousseau à la connexion

Plutôt que d'avoir à exécuter manuellement et à ajouter votre clé au trousseau, ajoutez simplement ce qui suit à la fin de votre ~/.bash_profile:

$ keychain --clear $HOME/.ssh/id_rsa
$ . $HOME/.keychain/$(uname -n)-sh

Cela garantit que lors de votre première connexion, après un redémarrage, vous êtes invité à saisir la phrase de passe de votre clé. Votre clé restera alors dans le trousseau jusqu'au prochain redémarrage ou vous effacerez le trousseau manuellement.

Cron Jobs utilisant le trousseau

Avec ce qui précède entré dans votre ~/.bash_profilefichier, vous pouvez profiter du fait que votre clé est maintenant stockée dans le trousseau en achetant le même fichier avant l'exécution de votre cronjob. Par exemple, j'ai un script de sauvegarde qui s'exécute à 21h00 chaque nuit et copie des trucs sur un ordinateur distant via SSH. Ceci est une entrée dans mon crontab ( crontab -e):

 0 21 * * * . $HOME/.keychain/$(uname -n)-sh; $HOME/backup_script.sh
Nathan S. Watson-Haigh
la source
1

Utilisez ssh-agent pour vous authentifier automatiquement (avec un nom de shell comme argument pour que les variables d'environnement de l'agent soient définies dans ce nouveau shell). Ajoutez la clé avec ssh-add et tapez votre mot de passe une seule fois.

$ ssh-agent bash
$ ssh-add
Enter passphrase for /xxxx/.ssh/identity: 
$ 
$ pssh ...
Emmanuel
la source