Je viens de passer de Snow Leopard à Lion, et mes tâches 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é depuis cron qui fonctionnait 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 commandes, ce script fonctionne comme prévu.
Lorsqu'il est exécuté à partir de cron, cela ne fonctionne pas. La sortie de ssh-agent 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 ssh -vvv
sortie montre qu'elle échoue juste au moment où la clé 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 s'attend à ce que je tape la phrase secrète pour ~/.ssh/id_dsa
, ce qui bien sûr ne fonctionne pas dans les tâches cron.
Tout cela a fonctionné dans Snow Leopard.
Notez que j'ai la configuration de l'accès au trousseau pour que ssh
, ssh-agent
et ssh-add
soient autorisés à lire ma phrase secrète pour mon .ssh/id_dsa
fichier - en conséquence, je peux SSH à partir d'une invite de terminal sans jamais avoir à entrer ma phrase secrète.
Est-ce que ce problème que je dois exécuter ssh-add
à un moment donné de mon processus de connexion? L'exécuter à partir d'une invite bash standard n'aide pas le travail cron (bien que, bizarrement, il me demande ma phrase secrète ... qui, je pense, n'est pas nécessaire en raison de la configuration de l'accès au trousseau).
NOTE 1 - avant de me rediriger - je suis conscient 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 (bien que je pense que cette question répondra également à celle-ci) ).
NOTE 2 - Je me rends compte que les clés SSH sans mot de passe résoudraient mon problème; mais je préfère ne pas suivre cette voie.
Réponses:
Pour tous ceux qui se retrouvent sur cette page, j'ai réalisé que je devrais poster la réponse:
L'utilisation de launchd au lieu de cron résout en effet le problème d'autorisation. Vos travaux de lancement par l'utilisateur (qui ne s'exécutent que lorsque vous êtes connecté) utilisent correctement les informations de l'agent SSH qui ont été déverrouillées via votre trousseau dans le cadre de la connexion (dans le cadre de la gestion de clé OS X standard, aucun autre logiciel requis).
Pour minimiser mes interactions avec launchd, j'ai créé un seul travail launchd qui appelle un script bash. De cette façon, je peux simplement éditer le script sans avoir à lancer Launchd.
Voici le fichier launchd:
J'ai enregistré le fichier dans
~/Library/LaunchAgents/com.mycron.hourly.plist
, puis l' ai chargé avec:Une fois chargé, il s'exécutera immédiatement, puis à nouveau toutes les 60 minutes.
Si vous suivez la même procédure, vous voudrez changer la chaîne `ProgramArguments 'avec le bon chemin vers votre script.
la source
L'ajout du code suivant à votre script shell bash résoudra le problème:
Remplacez-le
your_user
par votre propre nom d'utilisateur.Ce code définit la valeur correcte pour
SSH_AUTH_SOCK
qui informessh
ouscp
comment communiquer avecssh-agent
lorsque le script shell est démarrécron
.la source
zsh: no matches found: /tmp/launch-*/Listeners
Je m'attendrais à une sécurité renforcée comme le bac à sable et des changements pour déplacer davantage les choses vers 64 bits causent un chagrin inattendu.
Ce n'est pas une réponse en soi, mais launchd reçoit tout l'amour d'Apple ces jours-ci.
Il ne résout pas le problème de cron, mais est plus stable et plus de personnes peuvent l'aider.
la source
Pour quiconque le trouve maintenant, essaie de faire fonctionner cela dans El Capitan, et hésite toujours à transformer votre travail cron d'une ligne en un script de lancement, la réponse de Werner Antweiler fonctionne toujours mais le chemin a changé. Ce qui suit a fonctionné pour moi:
REMARQUE : n'oubliez pas de remplacer votre_utilisateur par votre nom d'utilisateur!
Cela ne me permettrait pas de soumettre cela comme un 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 définitivement aidé à la configurer.
Édition: 30 mars 2016
Après avoir testé cela pendant un certain temps, je dois ajouter que cela ne fonctionne que lorsque l'agent a été utilisé au moins une fois lors de cette connexion. Il suffit de lancer une connexion ssh ou d'exécuter manuellement ssh-agent. Un script de démarrage peut également être utilisé si vous souhaitez qu'il s'exécute automatiquement. J'ai créé un startup.sh qui exécute simplement ssh-agent, puis j'ai utilisé l'Éditeur de script pour enregistrer un .app avec les éléments suivants et j'ai ajouté l'application résultante à mes éléments de connexion:
la source
ls /private/tmp/com.apple.launchd.*/Listeners
. Vous n'avez rien d'autre à faire que vous connecter à mac.