Automatizando uma conexão ssh com o crontab

1

Eu tenho lutado para crontab automatizar um processo de git push com o ssh, e está sendo complicado configurar uma chave com o agente ssh. Começando com um script básico para testar o agente:

# set paths (all examples)
source /etc/profile
export PATH=$PATH:/Users/myusername/.ssh

eval "$(ssh-agent)" > ssh_agent.txt
/usr/bin/ssh-add -l >> ssh_agent.txt

.., que produz o seguinte:

Agent pid 16062
The agent has no identities.

Então o agente está ativo. Agora, adicione a chave e verifique se ela está registrada no agente. No iTerm2 manualmente isto funciona ok:

/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa
2048 [key fingerprint] /Users/myusername/.ssh/id_rsa (RSA)

Eu tento replicar isso dentro de um trabalho de crontab, usando este script:

/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa
/usr/bin/ssh-add -l >> ssh_agent.txt

.. que informa The agent has no identities para arquivo e o seguinte via "You have mail in /var/mail/myusername" :

[email metadata]
Enter passphrase for /Users/myusername/.ssh/id_rsa: 

Portanto, a chave está tentando carregar, mas está pegando no prompt da senha. Aqui, quero usar expect para fornecer a frase secreta, conforme descrito nesta resposta unix.stackexchange (que parece que deveria funcionar no OSX):

#!/usr/bin/expect -f
/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa
expect "Enter passphrase for /Users/myusername/.ssh/id_rsa:"
send "mypassphrase\n";
interact

A resposta de erro de e-mail é:

Enter passphrase for /Users/myusername/.ssh/id_rsa: 
couldn't read file "Enter passphrase for /Users/myusername/.ssh/id_rsa:": no such file or directory
/Users/myusername/test/crontest.sh: line 17: send: command not found
/Users/myusername/test/crontest.sh: line 18: interact: command not found

Por isso, tentei uma configuração alternativa com base nesta resposta SO :

#!/usr/bin/expect -f
expect -c "
/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa
expect \"Enter passphrase for /Users/myusername/.ssh/id_rsa: \"
send \"mypassphrase\n\";
interact
"

.. e receba o seguinte relatório de erros de e-mail:

invalid command name "/usr/bin/ssh-add"
    while executing
"/usr/bin/ssh-add /Users/myusername/.ssh/id_rsa"
Could not open a connection to your authentication agent.

Eu não entendo o problema aqui - o agente ssh funciona e a chave parece acessível, então qual é a questão da 'conexão'? Eu tentei outras configurações para expect sem sucesso. Muito grato pela ajuda.

    
por geotheory 27.03.2015 / 10:47

2 respostas

1

Eu não recomendaria a exibição de ssh-add ou expect em uma tarefa do cron, já que é excessivamente complicado para executá-lo no ambiente limitado que o cron usa para executar seus trabalhos e prefiro não armazenar senhas no crontab.

Em vez de usar sua chave SSH normal, eu criaria uma nova chave que sempre é para ser usado para executar o comando que você deseja executar pelo cron. Eu configuraria o key sem uma frase-senha e altere sua propriedade / permissões (0600) para que possa ser acessada apenas pelo ID do usuário efetivo que a tarefa do cron executa como, por exemplo, o ID dos usuários cujo crontab está sendo processado.

No seu caso específico, o comando específico é git push , então a nova chave teria que ser enviada para o seu servidor git. A maioria dos servidores git deve ser capaz de aceitar várias chaves SSH públicas.

Em geral, para processos automatizados, é melhor criar chaves específicas sem frases secretas. Um conjunto restrito de comandos permitidos é então configurado no servidor SSH remoto, colocando pares de opções na sua linha no authorized_keys file, por exemplo,

command="automated-task.sh",client=my.local.host,no-pty,no-agent-forwarding,no-port-forwarding ssh-rsa AAA…public…part…of…specific…keypair automated_user@server

Disclaimer: Eu tenho mais experiência com o GNU / Linux do que com o OS X, mas com o AFAIK as informações acima devem se aplicar a todos os sistemas * nix.

    
por 27.03.2015 / 12:19
1

Resposta alternativa

Eu apenas pensei em dar uma olhada mais de perto nos seus scripts expect e notei que eles estão perdendo o comando spawn :

#!/usr/bin/expect -f
spawn /usr/bin/ssh-add /Users/myusername/.ssh/id_rsa
expect "Enter passphrase for /Users/myusername/.ssh/id_rsa:"
send "mypassphrase\n";
interact

Do manual expect :

spawn [args] program [args]

creates a new process running program args. Its stdin, stdout and stderr are connected to Expect, so that they may be read and written by other Expect commands. The connection is broken by close or if the process itself closes any of the file identifiers.

    
por 27.03.2015 / 12:36