parallel-ssh con chiave SSH protetta da passphrase


8

Mi piacerebbe usare la mia chiave SSH protetta da passphrase quando eseguo attività con parallel-ssh(e strumenti correlati). Tuttavia, non riesco a farlo funzionare.

Tutta la documentazione relativa a parallel-sshciò dimostra che dovrei essere in grado di usare --askpasso -Afare questo:

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

Tuttavia, quando inserisco la passphrase della mia chiave, non funziona:

$ 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).

Ho confermato che la mia chiave SSH e la passphrase funzionano su ciascuna delle macchine, quindi non ho idea di come farlo funzionare.


Suppongo che parallel-ssh sia uguale a pssh?
slm

Sì, parallel-sshe psshsono davvero gli stessi.
Nathan S. Watson-Haigh,

Risposte:


5

Supponendo che parallel-sshe psshsiano equivalenti, allora sì, ciò che stai tentando di fare dovrebbe funzionare bene con il piping della passphrase utilizzando l' -Ainterruttore.

Esempio

Ecco un esempio in cui mi collego a 2 sistemi diversi host1e host2. Uso l' -linterruttore per psshfornire un utente predefinito di root. Tuttavia, host2ho la precedenza su questo -Hswitch specificando il nome host come 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/master-user1@ssh-tunnel.mydomain.com:22 already exists, disabling multiplexing
X11 forwarding request failed on channel 0
Killed by signal 1.

Quando i lavori di cui sopra si noterà l'output del comando sto correndo, echo "hi".

Il tuo problema

Il problema che stai riscontrando con una passphrase sulla tua coppia di chiavi SSH è dovuto a un bug. Questo è il bug intitolato: Problema 80: Non passare la passphrase? . Il quarto commento a quel problema mostra una patch:

estratto

# 4 robine ... @ gmail.com

Ho cambiato la linea in

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

e sembra funzionare

Riferimenti


Grazie per il tuo input slm. parallel-sshe psshsono davvero gli stessi. Non stavo chiedendo se fosse possibile - la documentazione chiarisce che è possibile. Sto avendo problemi a farlo funzionare davvero come è documentato.
Nathan S. Watson-Haigh,

1
@ NathanS.Watson-Haigh - vedi aggiornamento. È un bug, ho aggiornato la patch.
slm

Questo è davvero il problema che mi sta colpendo. Tuttavia, poiché gli autori di non parallel-sshsono ancora sicuri del modo migliore per rilevare la domanda di richiesta della password e quindi rispondere con la password / frase inserita, continuerò con il mio metodo portachiavi. Non vorrei che la mia passphrase venisse rivelata inavvertitamente alla domanda sbagliata.
Nathan S. Watson-Haigh,

1
Accetterò questa come risposta mentre riuscivi a capire che si trattava di un bug noto nel modo in cui parallel-sshpassa la passphrase SSH. Tuttavia, per coloro che incontreranno questa domanda in futuro, questo errore potrebbe essere stato corretto o potresti scegliere di non modificare il askpass_client.pyfile. In entrambi i casi, puoi aggirare il problema utilizzando la keychainrisposta ( unix.stackexchange.com/a/128998/57414 ) o la risposta ssh-agent ( unix.stackexchange.com/a/129022/57414 )
Nathan S. Watson- Haigh,

5

Sono riuscito a farlo funzionare installando keychaininvece di correggere manualmente il bug che causa i miei problemi.

Installa ed esegui manualmente portachiavi

# 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

Esegui comando senza input password / passphrase

Ora questa volta non ho bisogno della mia passphrase quando chiamo parallel-sshperché il portachiavi si occupa dell'autenticazione:

$ 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

Esegui portachiavi al login

Invece di dover eseguire manualmente e aggiungere la tua chiave al portachiavi, aggiungi semplicemente quanto segue alla fine del tuo ~/.bash_profile:

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

Ciò garantisce che al primo accesso, a seguito di un riavvio, venga richiesto il passphrase della chiave. La chiave rimarrà quindi nel portachiavi fino al prossimo riavvio o si cancella manualmente il portachiavi.

Cron Jobs Utilizzando il portachiavi

Con quanto sopra inserito nel tuo ~/.bash_profilefile, puoi trarre vantaggio dal fatto che la tua chiave è ora memorizzata nel portachiavi inacidendo lo stesso file prima che il tuo cronjob venga eseguito. Ad esempio, ho uno script di backup che viene eseguito alle 21:00 ogni notte e copia le cose su un computer remoto tramite SSH. Questa è una voce nel mio crontab ( crontab -e):

 0 21 * * * . $HOME/.keychain/$(uname -n)-sh; $HOME/backup_script.sh

1

Utilizzare ssh-agent per autenticarsi automaticamente (con un nome di shell come argomento per impostare le variabili di ambiente dell'agent in quella nuova shell). Aggiungi la chiave con ssh-add e digita la password una sola volta.

$ ssh-agent bash
$ ssh-add
Enter passphrase for /xxxx/.ssh/identity: 
$ 
$ pssh ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.