Acabei de atualizar do Snow Leopard para o Lion e meus trabalhos do cron que usam ssh pararam de funcionar. Parece que o ssh-agent não está mais funcionando conforme o esperado.
Aqui está uma versão reduzida do meu script chamado from-cron que funcionou muito bem no Snow Leopard:
#!/bin/bash
whoami # just to verify I'm running as myself, not root
ssh-agent # just to see what it outputs
eval `ssh-agent`
ssh -vvv REMOTESERVER ls
Quando executado no prompt de comando, esse script funciona conforme o esperado.
Quando executado a partir do cron, ele não funciona. A saída do ssh-agent parece normal:
SSH_AUTH_SOCK=/tmp/ssh-QRxPUMRxbu/agent.17147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17148; export SSH_AGENT_PID;
echo Agent pid 17148;
Agent pid 17150
Mas a ssh -vvv
saída mostra que falha exatamente quando a chave privada deve ser lida:
debug1: Server accepts key: pkalg ssh-dss blen 818
debug2: input_userauth_pk_ok: fp ...
debug3: sign_and_send_pubkey: DSA ...
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: Device not configured
debug2: no passphrase given, try next key
Em outras palavras, ele espera que eu digite a senha para ~/.ssh/id_dsa
, a qual, obviamente, não funciona nos trabalhos do cron.
Tudo isso funcionou no Snow Leopard.
Observe que eu tenho a configuração do Keychain Access para que ssh
, ssh-agent
e ssh-add
possa ler minha frase secreta para o meu .ssh/id_dsa
arquivo - como resultado, eu posso fazer o SSH a partir de um prompt do terminal sem precisar digitar minha senha.
É esse problema que eu preciso executar ssh-add
em algum momento do meu processo de login? Executá-lo a partir de um prompt padrão do bash não ajuda no trabalho do cron (embora, estranhamente, ele me solicite minha frase secreta ... o que eu consideraria desnecessário devido à configuração do Keychain Access).
NOTA 1 - antes de me redirecionar - estou ciente de que existe uma pergunta semelhante aqui (
Mac OS X Lion e sshpass ), mas trata-se especificamente de um programa sshpass
que não uso (embora acredite que essa pergunta também seja respondida por essa) )
NOTA 2 - Percebo que as chaves SSH sem frase secreta resolveriam meu problema; no entanto, prefiro não seguir esse caminho.
Respostas:
Para quem acaba nesta página, percebi que deveria postar a resposta:
Usar o launchd em vez do cron realmente corrige o problema de autorização. Os trabalhos de inicialização do usuário (que são executados apenas quando você está conectado) usam corretamente as informações do agente SSH que foram desbloqueadas através do seu chaveiro como parte do login (como parte do gerenciamento de chaves padrão do OS X, nenhum outro software é necessário).
Para minimizar minhas interações com o launchd, criei um único trabalho launchd que chama um script bash. Dessa forma, eu posso simplesmente editar o script sem lidar com o launchd.
Aqui está o arquivo launchd:
Salvei o arquivo
~/Library/LaunchAgents/com.mycron.hourly.plist
e carreguei-o com:Uma vez carregado, ele será executado imediatamente e novamente a cada 60 minutos.
Se você seguir o mesmo procedimento, altere a string `ProgramArguments 'pelo caminho certo para o seu script.
fonte
Adicionar o seguinte código ao script shell bash corrigirá o problema:
Substitua
your_user
por seu próprio nome de usuário.Este código define o valor correto para
SSH_AUTH_SOCK
que informassh
ouscp
sobre como se comunicar comssh-agent
quando o shell script é iniciado fora docron
.fonte
zsh: no matches found: /tmp/launch-*/Listeners
Eu esperaria que a segurança aprimorada, como a sandbox e as alterações para mudar ainda mais as coisas para 64 bits, esteja causando sofrimento inesperado.
Não é uma resposta, por si só, mas o launchd está recebendo todo o amor da apple nos dias de hoje.
Não está corrigindo o problema do cron, mas é mais estável e mais pessoas podem ajudá-lo.
fonte
Para qualquer um que encontre isso agora, tentando fazer isso funcionar em El Capitan, e ainda relutante em transformar seu trabalho cron de uma linha em um script launchd, a resposta de Werner Antweiler ainda funciona, mas o caminho mudou. O abaixo funcionou para mim:
NOTA : lembre-se de substituir seu_usuário por seu nome de usuário!
Não me deixaria enviar isso como um comentário sobre a resposta dele, pois não tenho reputação, mas não queria deixá-la sem atualizar isso, pois definitivamente me ajudou a finalmente configurá-lo.
Edit: 30 de março de 2016
Depois de testar isso por um tempo, preciso acrescentar que isso só funciona quando o agente tiver sido usado pelo menos uma vez durante o login. Iniciar uma conexão ssh ou executar manualmente o ssh-agent é suficiente para fazê-lo. Um script de inicialização também pode ser usado se você desejar que seja executado automaticamente. Criei um startup.sh que apenas executa o ssh-agent e, em seguida, usei o Editor de scripts para salvar um .app com o seguinte e adicionei o aplicativo resultante aos meus itens de login:
fonte
ls /private/tmp/com.apple.launchd.*/Listeners
. Você não precisa fazer nada, exceto fazer login no mac.