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 ser capaz de usar --askpass
ou -A
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 insiro a senha da minha chave, ela 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, então não tenho ideia de como fazer isso funcionar.
Responder1
Supondo que parallel-ssh
e pssh
sejam equivalentes, então sim, o que você está tentando fazer deve funcionar perfeitamente ao canalizar a senha usando o -A
switch.
Exemplo
Aqui está um exemplo em que me conecto a dois sistemas diferentes host1
e o host2
. Eu uso a -l
opção pssh
para fornecer um usuário padrão do root
. No entanto, host2
eu substituo isso no -H
switch 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 procedimento 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 bug. Este é o bug intitulado:Problema 80: Não está passando a senha?. O quarto comentário sobre esse problema mostra um patch:
excerto
#4[e-mail protegido]
mudei a linha para
if not ( prompt.strip().lower().endswith('password:') or 'enter passphrase for key' in prompt.strip().lower()):
E parece que funciona
Referências
Responder2
Consegui fazer isso funcionar instalando keychain
em vez de corrigir manualmente oerrocausando meus problemas.
Instalar e executar manualmente o chaveiro
# 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 entrada de senha/frase secreta
Agora, desta vez, não preciso da minha senha ao ligar, 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
Execute o chaveiro no login
Em vez de ter que executar manualmente e adicionar sua chave ao chaveiro, basta adicionar o seguinte ao final do seu arquivo ~/.bash_profile
:
$ keychain --clear $HOME/.ssh/id_rsa
$ . $HOME/.keychain/$(uname -n)-sh
Isso garante que no seu primeiro login, após uma reinicialização, você seja solicitado a fornecer a senha da sua chave. Sua chave permanecerá no chaveiro até a próxima reinicialização ou você limpará o chaveiro manualmente.
Cron Jobs usando o chaveiro
Com o acima inserido em seu ~/.bash_profile
arquivo, você pode aproveitar o fato de sua chave agora estar armazenada no chaveiro, alterando o mesmo arquivo antes que seu cronjob seja executado. Por exemplo, eu tenho um script de backup que é executado às 21h todas as noites e copia coisas 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
Responder3
Use oagente sshpara autenticar automaticamente (com um nome de shell como argumento para ter as variáveis de ambiente do agente definidas nesse novo shell). Adicione a chave comssh-adicionare digite sua senha apenas uma vez.
$ ssh-agent bash
$ ssh-add
Enter passphrase for /xxxx/.ssh/identity:
$
$ pssh ...