Parece que estou tendo uma discrepância entre o comportamento do ssh-agent para duas contas que configurei.
Escrevi um script de monitoramento simples para verificar a disponibilidade de algumas VMs em execução. Fiz todos os testes e depuração com minha conta de acesso principal. No processo, gerei um par de chaves SSH, iniciei o ssh-agent e adicionei a identidade ao agente para permitir que o script fosse ssh sem a necessidade de uma senha.
Agora, gostaria de executar este script como usuário de uma conta de serviço. Criei a conta de serviço e, para gerar as chaves, configurei temporariamente o shell de login para/bin/bash. Gerei minhas chaves, removi a senha e adicionei a identidade ao agente.
A discrepância parece estar na forma como o shell se conecta ao agente. Na minha conta de usuário, não precisei reiniciar o agente desde que comecei a testar (cerca de duas semanas). Mas, quando tento executar o script na conta de serviço, parece que preciso reiniciar o agente todas as vezes, adicionar a identidade e, em seguida, executar o trabalho.
Idealmente, gostaria que o agente fosse executado indefinidamente e que a conta de serviço se reconectasse automaticamente sempre que o script fosse executado, para que não precisasse gerenciar processos dentro do script. Analisei as configurações de cada conta e não encontrei diferenças. Qualquer visão seria muito apreciada.
**Editar: esqueci de ressaltar que o agente é executado continuamente, mas os processos shell para a conta de serviço não parecem estar utilizando-o e um novo precisa ser iniciado:
ovmmon 14043 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
ovmmon 14952 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
Responder1
Uma de duas coisas está acontecendo aqui:
- O agente ssh está realmente sendo fechado quando você sai
- O agente ssh ainda está em execução, mas você está perdendo as informações sobre seu PID e pipe
Você pode verificar qual é o caso executando ps -ef e verificando o ssh-agent.
Se o agente ssh estiver morto, você precisará de uma maneira de mantê-lo vivo. Aqui estão três maneiras de fazer isso:
- Você pode iniciar o ssh-agent a partir de um startscript quando o servidor for inicializado e ecoar a saída em um arquivo (com direitos de acesso apropriados para evitar uso indevido). Se você tornar a chave sem senha, também poderá adicionar a chave do script. (Obviamente, a última parte só é aconselhável quando a conta à qual você está se conectando tem direitos muito limitados no servidor remoto). Em seguida, faça com que seu script leia as informações do agente SSH do arquivo criado na inicialização.
- Use a tela ao fazer login na conta de serviço; em seguida, desconecte-se da sessão de tela depois de iniciar o agente.
- Use nohup ao iniciar o agente.
Se o agente ssh não estiver morto, mas você perdeu as informações do ambiente, certifique-se de que, ao iniciá-lo, ele grave suas variáveis de ambiente em um arquivo específico. Então, ao fazer login, faça com que seu shell forneça esse arquivo.
Responder2
Se você estiver usando um método de invocação de subshell, o agente ssh morrerá após o logout do shell. Se você usar o método eval, o shell permanecerá em execução até ser encerrado manualmente.
Ver:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm
Especificamente:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm#ch06-50031.html
Além disso, sei que executar variáveis ENV do cron pode causar problemas. Então essa é outra área a verificar.