parallel-ssh com chave SSH protegida por frase secreta

7

Gostaria de usar minha chave SSH protegida por senha ao executar tarefas com parallel-ssh (e ferramentas relacionadas). No entanto, não consigo fazer isso funcionar.

Toda a documentação, referente a parallel-ssh , mostra que eu deveria poder usar --askpass ou -A para fazer isso:

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

No entanto, quando eu insiro a frase secreta da minha chave, não funciona:

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

Confirmei que minha chave SSH e senha funcionam em cada uma das máquinas, por isso não tenho ideia de como fazer isso funcionar.

    
por Nathan S. Watson-Haigh 12.05.2014 / 02:42

3 respostas

4

Assumindo que parallel-ssh e pssh são equivalentes, então sim, o que você está tentando fazer deve funcionar muito bem com a passagem da senha usando a opção -A .

Exemplo

Aqui está um exemplo em que me conecto a dois sistemas diferentes, host1 e host2 . Eu uso a opção -l para pssh para fornecer um usuário padrão de root . No entanto, em host2 I, substituo isso na opção -H , especificando o nome do host como 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.

Quando o trabalho acima funcionar, você notará a saída do comando que estou executando, echo "hi" .

Seu problema

O problema que você está enfrentando com uma senha no seu par de chaves SSH é devido a um erro. Este é o bug intitulado: Problema 80: Não está passando a frase secreta? . O quarto comentário dessa edição mostra um patch:

trecho

#4 [email protected]

I changed the line to

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

and it seems to work

Referências

por 12.05.2014 / 03:42
5

Consegui fazer isso funcionar instalando keychain em vez de corrigir manualmente o erro causando meus problemas.

Instalar e executar manualmente o keychain

# 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

Executar comando sem senha / entrada de frase secreta

Agora, desta vez, não preciso da minha senha ao chamar parallel-ssh , pois o chaveiro cuida da autenticação:

$ 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

Executar chaveiro no login

Em vez de precisar executar manualmente e adicionar sua chave ao conjunto de chaves, basta adicionar o seguinte ao final do seu ~/.bash_profile :

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

Isso garante que, no primeiro login, após a reinicialização, a senha da sua chave seja solicitada. Sua chave permanecerá no chaveiro até a próxima reinicialização ou você limpará o chaveiro manualmente.

Cron Jobs usando o chaveiro

Com as informações acima digitadas no arquivo ~/.bash_profile , você pode aproveitar o fato de que sua chave agora está armazenada no keychain, acidificando o mesmo arquivo antes que o seu cronjob seja executado. Por exemplo, eu tenho um script de backup que é executado às 21:00 a cada noite e copia o material para um computador remoto via SSH. Esta é uma entrada no meu crontab ( crontab -e ):

 0 21 * * * . $HOME/.keychain/$(uname -n)-sh; $HOME/backup_script.sh
    
por 12.05.2014 / 07:27
1

Use o ssh-agent para autenticar automaticamente (com um nome de shell como argumento para que as variáveis de ambiente do agente sejam definidas nesse novo shell). Adicione a chave com ssh-add e digite sua senha apenas uma vez.

$ ssh-agent bash
$ ssh-add
Enter passphrase for /xxxx/.ssh/identity: 
$ 
$ pssh ...
    
por 12.05.2014 / 11:00