Tendo um problema muito estranho. Eu criei um pequeno script bash que executa um comando em um host remoto via ssh (usando autenticação de chave pública).
Quando executo esse script manualmente a partir da linha de comando, ele funciona bem, mas quando colocado em /etc/cron.hourly, falha com Permission denied, please try again.
erro.
- Eu defini explicitamente a chave no script usando
ssh -i /root/.ssh/id_rsa user@remote "command"
; - o script está sendo executado como root (adicionei um
echo `id` > /tmp/whoami.log
para verificar novamente); e - a chave ssh não é protegida por senha ...
O sistema é o servidor Ubuntu 12.04, não tenho muito acesso no lado remoto para solucionar problemas, mas como eu disse, executar o ssh manualmente ou o mesmo script bash na linha de comando funciona.
Alguma idéia de por que isso está acontecendo ou como corrigi-lo?
atualizar
Acontece que eu estava enganado, e a chave ssh estava protegida por senha (com as chaves carregando o ssh-agent), por isso, falhou em um script, mas não ao executar a partir da sessão do bash. A adição . ~/.keychain/$HOSTNAME-sh
ao meu script resolveu o problema (graças a @grawity, que me indicou a direção certa e forneceu uma resposta abrangente).
SSH_AUTH_SOCK
eKRB5CCNAME
variáveis de ambiente.SSH_AUTH_SOCK
está relacionado (embora tenha prazer em tentar qualquer coisa). Estou acessando o arquivo de chave diretamente e o arquivo de chave não está protegido por senha. Quanto aKRB5CCNAME
uma pesquisa rápida mostrou que isso tem algo a ver com o Kerberos. Mais uma vez - não vê a ligação a este problema, mas talvez eu estou faltando alguma coisa aqui ...-v
opção para quessh
o comando ...ssh -i
comando nos dois casos ... Vou tentar desmarcar essas variáveis no script e ver. Boa sugestão para adicionar-v
- eu vou adicioná-lo também.Respostas:
Comandos interativos e tarefas cron executadas em ambientes diferentes - em particular, uma sessão interativa pode ter um agente SSH em execução ou um Kerberos TGT armazenado. Devido à maneira como os
ssh
métodos de autenticação são solicitados, você não pode ter certeza de que sua chave é usada apenas porque você adicionou a-i
opção.Se um agente SSH estiver em execução, o
ssh
cliente sempre tenta as chaves do agente antes de usar qualquer chave especificada explicitamente.Se a rede usa Kerberos e um Kerberos TGT estiver presente, o OpenSSH o usará antes de tentar a autenticação de chave pública.
Não sei nada sobre o seu ambiente, mas é fácil verificar essas duas possibilidades:
Adicione
unset SSH_AUTH_SOCK
eunset KRB5CCNAME
antes dossh
comando e, em seguida , execute manualmente o script modificado.Isso impedirá que o script veja o agente ou os tíquetes Kerberos e usará apenas a chave especificada explicitamente.
Adicione a
-v
opção assh
. Isso exibirá mais detalhes sobre como a autenticação acontece.Você também pode adicionar
-oIdentitiesOnly=yes
aossh
comando; isso forçará o uso da chave especificada .Geralmente, isso não é recomendado, pois o agente geralmente está intimamente ligado à sua sessão de logon interativo. Em particular, ele é iniciado apenas quando você faz login e mata quando você faz logoff - e ele precisa de sua senha para desbloquear as chaves SSH (supondo que elas estejam protegidas por senha).
Você mencionou "Keychain" - este é o programa OS X ou o script Linux? (Não sei muito sobre a arquitetura do Mac OS X, mas o AFAIK torna muito mais difícil acessar o agente ssh do usuário a partir de um cronjob ...)
fonte
Outra solução alternativa para esse problema é definir cron como ssh na caixa local para, por sua vez, executar o comando ssh em vez de executar o arquivo ou comando por seu caminho absoluto local. Isso armazena em cache o KRB5CCNAME e funciona onde / path / command não.
fonte
Você pode usar o ssh-cron para configurar conexões SSH agendadas para proteger servidores sem expor suas chaves SSH, mas usando o agente SSH.
fonte
você pode executar seu script ou comando no crontab como:
0 * * * * bash -c -l "/home/user/sshscript.sh"
ou
0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"
fonte
cron
; portanto, isso realmente não parece fornecer uma resposta.