ssh-under-cron cesse de fonctionner dans OS X 10.7 Lion

Je viens de passer de Snow Leopard à Lion, et mes emplois cron qui utilisent ssh ont cessé de fonctionner. Il semble que ssh-agent ne fonctionne plus comme prévu.

Voici une version bowdlerized de mon script appelé-de-cron qui a fonctionné très bien sous 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 

Lorsqu'il est exécuté à partir de l'invite de commands, ce script fonctionne comme prévu.

Lorsqu'il fonctionne à partir de Cron, cela ne fonctionne pas. La sortie de l'agent ssh semble normale:

 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 

Mais la sortie ssh -vvv montre qu'il échoue correctement lorsque la key privée doit être lue:

 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 

En d'autres termes, il m'attend à ce que je tapez la phrase de passe pour ~/.ssh/id_dsa , ce qui évidemment ne fonctionne pas dans les emplois cron.

Tout cela a fonctionné dans Snow Leopard.

Notez que j'ai l'installation de l'access au keyboard pour que ssh , ssh-agent et ssh-add soient autorisés à lire mon mot de passe pour mon file .ssh/id_dsa – en conséquence, je peux SSH depuis un terminal sans jamais avoir à entrer ma phrase de passe.

Est-ce que ce problème que j'ai besoin d'exécuter ssh-add à un moment donné dans mon process de connection? Exécuter à partir d'une invite de bash standard ne permet pas le travail de cron (bien que, curieusement, il me prête pour ma phrase de passe … ce que je pense qu'il n'est pas nécessaire b / c de la configuration d'access de porte-keys).

NOTE 1 – avant de me redirect – Je sais qu'il y a une question similaire ici ( Mac OS X Lion et sshpass ), mais il s'agit spécifiquement d'un programme sshpass que je n'utilise pas (même si je crois que cette question serait répondu par celui-ci comme bien).

NOTE 2 – Je ne peux pas créer la balise "cron" b / c Je manque de représentant suffisant. Si quelqu'un avec une aspiration suffisante pourrait le faire et marquer cette question, ce serait génial.

NOTE 3 – Je me rends count que les keys SSH sans mot de passe résoudraient mon problème; Cependant, je préférerais ne pas aller sur cette route.

    Pour ceux qui finissent sur cette page, j'ai réalisé que je devrais postr la réponse:

    L'utilisation de launchd au lieu de cron résout bien le problème d'autorisation. Vos tâches lancées par l'user (qui s'exécutent uniquement lorsque vous êtes connecté) utilisent correctement les informations de l'agent SSH déverrouillées via votre porte-keys dans le cadre de la connection (dans le cadre de la gestion des keys OS X standard, aucun autre logiciel n'est requirejs).

    Pour minimiser mes interactions avec launchd, j'ai créé un seul travail lancé qui appelle un script bash. De cette façon, je peux simplement éditer le script sans traiter avec launchd.

    Voici le file lancé:

     <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <ssortingng>com.mycron.hourly</ssortingng> <key>ProgramArguments</key> <array> <ssortingng>/Users/john/bin/cron.hourly</ssortingng> </array> <key>Nice</key> <integer>1</integer> <key>StartInterval</key> <integer>3600</integer> <!-- start every X seconds --> <key>RunAtLoad</key> <true/> </dict> </plist> 

    J'ai enregistré le file dans ~/Library/LaunchAgents/com.mycron.hourly.plist , puis l' ~/Library/LaunchAgents/com.mycron.hourly.plist chargé avec:

     launchctl load ~/Library/LaunchAgents/com.mycron.hourly.plist 

    Une fois chargée, elle se déroulera tout de suite toutes les 60 minutes.

    Si vous suivez la même procédure, vous souhaitez modifier la string `ProgramArguments 'avec le bon path vers votre script.

    L'ajout du code suivant à votre script bash shell va résoudre le problème:

    declare -x SSH_AUTH_SOCK = $ (find / tmp / launch – * / Listeners -user your_user -type s | head -1)

    Remplacez "votre user" par votre propre nom d'user.

    Ce code définit la valeur correcte pour SSH_AUTH_SOCK qui informe "ssh" ou "scp" sur la façon de communiquer avec "ssh-agent" lorsque le script shell est démarré à partir de "cron".

    Je m'attends à ce que la security améliorée, comme le sandbox, et les modifications pour déplacer les choses en 64 bits, cause un chagrin inattendu.

    Ce n'est pas une réponse, en soi, mais launchd a tout l'amour de Apple ces jours-ci.

    Il ne s'agit pas de résoudre le problème de Cron, mais il est plus stable ainsi que d'autres personnes peuvent l'aider.

    Pour ceux qui ont trouvé cela maintenant, en essayant de faire fonctionner cela à El Capitan, et toujours réticents à transformer votre travail Cron One-Line en un script lancé, la réponse de Werner Antweiler fonctionne toujours, mais le path a changé. Ce qui suit a fonctionné pour moi:

     declare -x SSH_AUTH_SOCK=$(find /var/folders/*/*/*/*/agent.* -user your_user -type s | head -1) 

    REMARQUE : n'oubliez pas de replace votre user par votre nom d'user!

    Cela ne me laisserait pas soumettre cela en tant que commentaire sur sa réponse car je n'ai pas la réputation, mais je ne voulais pas la quitter sans la mettre à jour, car cela m'a certainement aidé à la mettre en place.

    Édition: 30 mars 2016

    Après avoir testé ceci pendant un certain time, je dois append que cela ne fonctionne que lorsque l'agent a été utilisé au less une fois pendant cette connection. L'ouverture d'une connection ssh ou l'exécution manuelle d'un agent ssh suffit à le faire. Un script de démarrage peut également être utilisé si vous voulez qu'il s'exécute automatiquement. J'ai créé startup.sh qui exécute simplement ssh-agent puis éditeur de script utilisé pour save un .app avec ce qui suit et a ajouté l'application résultante à mes éléments de connection:

     do shell script "/path/to/startup.sh"