13 votes

ssh-under-cron ne fonctionne plus sous OS X 10.7 Lion

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 bowdlerisée de mon script called-from-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 commande, ce script fonctionne comme prévu.

Lorsqu'il est exécuté à partir de cron, il 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 le ssh -vvv montre qu'il é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 de passe pour ~/.ssh/id_dsa ce qui, bien entendu, ne fonctionne pas dans les tâches cron.

Tout cela a fonctionné dans Snow Leopard.

Notez que j'ai configuré Keychain Access de sorte que ssh , ssh-agent et ssh-add sont autorisés à lire ma phrase de passe pour ma .ssh/id_dsa ce qui me permet d'utiliser SSH à partir d'une invite de terminal sans avoir à saisir ma phrase de passe.

Est-ce que c'est un 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, curieusement, il me demande ma phrase de passe ... ce qui, à mon avis, n'est pas nécessaire en raison de la configuration de Keychain Access).

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 trouverait également une réponse dans celle-ci).

NOTE 2 - Je réalise que les clés SSH sans phrase de passe résoudraient mon problème, mais je préfère ne pas suivre cette voie.

10voto

John Hart Points 429

Pour tous ceux qui se retrouvent sur cette page, j'ai réalisé que je devais poster la réponse :

L'utilisation de launchd au lieu de cron résout effectivement le problème d'autorisation. Les tâches launchd de votre 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 de clés dans le cadre de la connexion (dans le cadre de la gestion standard des clés sous OS X, aucun autre logiciel n'est nécessaire).

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

Voici le fichier launchd :

<?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>
  <string>com.mycron.hourly</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/john/bin/cron.hourly</string>
  </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 fichier dans ~/Library/LaunchAgents/com.mycron.hourly.plist et l'a chargé avec :

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

Une fois chargé, il s'exécute 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.

8voto

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

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

Remplacer your_user avec votre propre nom d'utilisateur.

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

1voto

Oskar Points 1242

Je m'attendrais à ce que la sécurité renforcée, comme le bac à sable, et les changements visant à passer à l'architecture 64 bits causent des problèmes inattendus.

Ce n'est pas une réponse, en soi, mais launchd reçoit tout l'amour d'apple ces jours-ci.

Cela ne résout pas le problème du cron, mais c'est plus stable et plus de personnes peuvent y contribuer.

1voto

Boogy Points 546

Pour tous ceux qui découvrent cette page maintenant, qui essaient de la faire fonctionner dans El Capitan et qui hésitent encore à transformer leur tâche cron d'une ligne en un script de launchd, la réponse de Werner Antweiler fonctionne toujours mais le chemin a changé. Le chemin ci-dessous a fonctionné pour moi :

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

NOTE : n'oubliez pas de remplacer votre_utilisateur par votre nom d'utilisateur !

Je n'ai pas pu soumettre ce message en tant que commentaire sur sa réponse car je n'ai pas la réputation nécessaire, mais je ne voulais pas la quitter sans mettre à jour ce message, car il m'a permis de mettre en place le système.

Edit : 30 mars 2016

Après avoir testé cela pendant un certain temps, je dois ajouter que cela ne fonctionne qu'une fois que l'agent a été utilisé au moins une fois pendant cette connexion. L'initiation d'une connexion ssh ou l'exécution manuelle de ssh-agent est suffisante pour le faire. Un script de démarrage peut également être utilisé si vous voulez qu'il s'exécute automatiquement. J'ai créé un startup.sh qui exécute juste ssh-agent et j'ai ensuite utilisé l'éditeur script pour enregistrer un .app avec ce qui suit et j'ai ajouté l'app résultante à mes éléments de connexion :

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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X