Ich habe gerade ein Upgrade von Snow Leopard auf Lion durchgeführt und meine Cron-Jobs, die ssh verwenden, funktionieren nicht mehr. Es scheint, dass ssh-agent nicht mehr wie erwartet funktioniert.
Hier ist eine Bowdler-Version meines Called-from-Cron-Skripts, die unter Snow Leopard hervorragend funktioniert hat:
#!/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
Wenn dieses Skript an der Eingabeaufforderung ausgeführt wird, funktioniert es wie erwartet.
Wenn von Cron ausgeführt wird, funktioniert es nicht. Die Ausgabe von ssh-agent sieht normal aus:
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
Die ssh -vvv
Ausgabe zeigt jedoch, dass es nicht richtig funktioniert, wenn der private Schlüssel gelesen werden soll:
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
Mit anderen Worten, es wird erwartet, dass ich die Passphrase für eingebe ~/.ssh/id_dsa
, was bei Cronjobs natürlich nicht funktioniert.
Dies alles funktionierte in Snow Leopard.
Beachten Sie, dass ich so , dass Schlüsselbund - Setup haben ssh
, ssh-agent
und ssh-add
erlaubt mein Passwort lesen für meine.ssh/id_dsa
Datei - als Ergebnis kann ich über eine Terminal-Eingabeaufforderung SSH ausführen, ohne jemals meine Passphrase eingeben zu müssen.
Ist das Problem, das ich ausführen muss ssh-add
irgendwann in meinem Anmeldevorgang muss? Das Ausführen von einer Standard-Bash-Eingabeaufforderung aus hilft dem Cron-Job nicht weiter (obwohl es mich seltsamerweise zur Eingabe meiner Passphrase auffordert ... was meiner Meinung nach in der Konfiguration von Keychain Access nicht unbedingt erforderlich ist).
HINWEIS 1 - Bevor Sie mich umleiten - Ich bin mir bewusst, dass es hier eine ähnliche Frage gibt (
Mac OS X Lion und sshpass ), aber es geht speziell um ein Programmsshpass
, das ich nicht verwende (obwohl ich glaube, dass diese Frage auch von diesem beantwortet werden würde ).
ANMERKUNG 2 - Mir ist klar, dass passphrasenlose SSH-Schlüssel mein Problem lösen würden. Ich würde es jedoch vorziehen, diesen Weg nicht zu gehen.
Antworten:
Für alle, die auf dieser Seite landen, wurde mir klar, dass ich die Antwort posten sollte:
Die Verwendung von launchd anstelle von cron behebt in der Tat das Autorisierungsproblem. Ihre vom Benutzer gestarteten Jobs (die nur ausgeführt werden, wenn Sie angemeldet sind) verwenden die über Ihren Schlüsselbund entsperrten SSH-Agenteninformationen korrekt als Teil der Anmeldung (im Rahmen der Standard-OS X-Schlüsselverwaltung ist keine andere Software erforderlich).
Um meine Interaktionen mit launchd zu minimieren, habe ich einen einzelnen launchd-Job erstellt, der ein Bash-Skript aufruft. Auf diese Weise kann ich das Skript einfach bearbeiten, ohne mich mit launchd zu befassen.
Hier ist die launchd-Datei:
Ich habe die Datei in gespeichert
~/Library/LaunchAgents/com.mycron.hourly.plist
und sie dann geladen mit:Einmal geladen, läuft es sofort und dann alle 60 Minuten wieder.
Wenn Sie auf die gleiche Weise vorgehen, möchten Sie die Zeichenfolge `ProgramArguments 'mit dem richtigen Pfad zu Ihrem Skript ändern.
quelle
Durch Hinzufügen des folgenden Codes zu Ihrem Bash-Shell-Skript wird das Problem behoben:
Ersetzen Sie
your_user
durch Ihren eigenen Benutzernamen.Dieser Code legt den korrekten Wert für
SSH_AUTH_SOCK
Informationenssh
oderscp
Informationen zur Kommunikation fest,ssh-agent
wenn das Shell-Skript gestartet wirdcron
.quelle
zsh: no matches found: /tmp/launch-*/Listeners
Ich würde eine verbesserte Sicherheit wie Sandbox erwarten und Änderungen, um die Dinge weiter auf 64-Bit zu verschieben, verursachen unerwarteten Kummer.
Es ist per se keine Antwort, aber launchd bekommt heutzutage die ganze Liebe von Apple.
Es behebt das Cron-Problem nicht, ist aber stabiler und es können mehr Leute damit helfen.
quelle
Für jeden, der dies jetzt findet, versucht, es in El Capitan zum Laufen zu bringen, und weiterhin zögert, Ihren einzeiligen Cron-Job in ein Startskript umzuwandeln, funktioniert die Antwort von Werner Antweiler weiterhin, aber der Pfad hat sich geändert. Das Folgende hat bei mir funktioniert:
HINWEIS : Denken Sie daran, Ihren_Benutzer durch Ihren Benutzernamen zu ersetzen!
Es würde mir nicht erlauben, dies als Kommentar zu seiner Antwort einzureichen, da mir der Ruf fehlt, aber ich wollte sie nicht verlassen, ohne dies zu aktualisieren, da es mir definitiv half, es endlich einzurichten.
Edit: 30. März 2016
Nachdem ich dies eine Weile getestet habe, muss ich hinzufügen, dass dies nur funktioniert, wenn der Agent während dieser Anmeldung mindestens einmal verwendet wurde. Dazu genügt es, eine SSH-Verbindung herzustellen oder den SSH-Agenten manuell auszuführen. Ein Startskript kann auch verwendet werden, wenn Sie möchten, dass es automatisch ausgeführt wird. Ich habe eine startup.sh erstellt, die nur ssh-agent ausführt, und dann mithilfe des Skript-Editors eine .app mit den folgenden Angaben gespeichert und die resultierende App zu meinen Anmeldeelementen hinzugefügt:
quelle
ls /private/tmp/com.apple.launchd.*/Listeners
. Sie müssen nichts weiter tun, als sich bei Mac anzumelden.