Ein sehr seltsames Problem haben. Ich habe ein kleines Bash-Skript erstellt, das einen Befehl auf einem Remote-Host über ssh ausführt (unter Verwendung der Authentifizierung mit öffentlichem Schlüssel).
Wenn ich dieses Skript manuell über die Befehlszeile ausführe, funktioniert es einwandfrei, aber wenn es in /etc/cron.hourly abgelegt wird, schlägt es mit einem Permission denied, please try again.
Fehler fehl .
- Ich setze den Schlüssel im Skript explizit mit
ssh -i /root/.ssh/id_rsa user@remote "command"
; - Das Skript wird als Root ausgeführt (ich habe ein
echo `id` > /tmp/whoami.log
zur Doppelprüfung hinzugefügt ). und - Der SSH-Schlüssel ist nicht passwortgeschützt ...
Das System ist ein Ubuntu 12.04-Server. Ich habe auf der Remote-Seite nicht viel Zugriff auf die Fehlerbehebung, aber wie gesagt, das manuelle Ausführen von ssh oder dasselbe Bash-Skript über die Befehlszeile funktioniert.
Irgendeine Idee, warum dies passiert oder wie man es behebt?
aktualisieren
Es stellte sich heraus, dass ich mich geirrt hatte und der SSH-Schlüssel durch ein Passwort geschützt war (wobei der Schlüsselbund den SSH-Agenten lud), weshalb er in einem Skript fehlgeschlagen ist, aber nicht, wenn er von der Bash-Sitzung ausgeführt wurde. Das Hinzufügen . ~/.keychain/$HOSTNAME-sh
zu meinem Skript löste das Problem (danke an @grawity, der mich in die richtige Richtung wies und eine umfassende Antwort gab).
SSH_AUTH_SOCK
undKRB5CCNAME
Umgebungsvariablen erneut testen .SSH_AUTH_SOCK
das zusammenhängt (obwohl ich gerne etwas probiere). Ich greife direkt auf die Schlüsseldatei zu und die Schlüsseldatei ist nicht passwortgeschützt. Wie fürKRB5CCNAME
eine schnelle Suche ergab dies etwas mit Kerberos zu tun ist. Wieder - sehen Sie nicht die Verbindung zu diesem Problem, aber vielleicht fehlt mir hier etwas ...-v
diesemssh
Befehl eine Option hinzufügen würden ...ssh -i
In beiden Fällen verwende ich den Befehl key explizit mit ... Ich werde versuchen, diese Variablen im Skript zu deaktivieren und zu sehen. Guter Vorschlag zum Hinzufügen-v
- ich werde es auch hinzufügen.Antworten:
Interaktive Befehle und Cron-Jobs werden in verschiedenen Umgebungen ausgeführt. In einer interaktiven Sitzung wird möglicherweise ein SSH-Agent ausgeführt oder ein Kerberos-TGT gespeichert. Aufgrund der Art und Weise
ssh
, wie Authentifizierungsmethoden bestellt werden, können Sie nicht sicher sein, dass Ihr Schlüssel verwendet wird, nur weil Sie die-i
Option hinzugefügt haben .Wenn ein SSH-Agent ausgeführt wird, versucht der
ssh
Client immer, Agentenschlüssel zu verwenden, bevor explizit angegebene Schlüssel verwendet werden.Wenn das Netzwerk Kerberos verwendet und ein Kerberos-TGT vorhanden ist, wird es von OpenSSH verwendet, bevor die Authentifizierung mit öffentlichem Schlüssel versucht wird.
Ich weiß nichts über Ihre Umgebung, aber beide Möglichkeiten sind leicht zu überprüfen:
In
unset SSH_AUTH_SOCK
undunset KRB5CCNAME
vor demssh
Befehl, dann manuell das modifizierte Skript ausführen.Dadurch wird verhindert, dass das Skript den Agenten oder die Kerberos-Tickets sieht, und es wird nur der explizit angegebene Schlüssel verwendet.
Fügen Sie die
-v
Option hinzussh
. Dadurch werden detailliertere Informationen zur Authentifizierung angezeigt.Sie können
-oIdentitiesOnly=yes
demssh
Befehl auch etwas hinzufügen . Dadurch wird die Verwendung des angegebenen Schlüssels erzwungen .Dies wird im Allgemeinen nicht empfohlen, da der Agent normalerweise eng mit Ihrer interaktiven Anmeldesitzung verbunden ist. Insbesondere wird es erst gestartet, wenn Sie sich anmelden, und beendet, wenn Sie sich abmelden - und es benötigt Ihr Passwort, um die SSH-Schlüssel tatsächlich zu entsperren (vorausgesetzt, sie waren passwortgeschützt).
Sie haben "Schlüsselbund" erwähnt - ist dies das OS X-Programm oder das Linux-Skript? (Ich weiß nicht viel über die Architektur von Mac OS X, aber AFAIK macht es viel schwieriger, von einem Cronjob aus auf den SSH-Agenten des Benutzers zuzugreifen ...)
quelle
Eine weitere Problemumgehung für dieses Problem besteht darin, cron auf ssh in der lokalen Box zu setzen, um wiederum den Befehl ssh auszuführen, anstatt die Datei oder den Befehl über ihren lokalen, absoluten Pfad auszuführen. Dies speichert den KRB5CCNAME zwischen und funktioniert dort, wo / path / command dies nicht tut.
quelle
Sie können ssh-cron verwenden , um geplante SSH-Verbindungen zum Sichern von Servern einzurichten, ohne Ihre SSH-Schlüssel offenzulegen, aber den SSH-Agenten zu verwenden.
quelle
Sie können Ihr Skript oder Ihren Befehl in crontab wie folgt ausführen:
0 * * * * bash -c -l "/home/user/sshscript.sh"
oder
0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"
quelle
cron
. Das scheint also keine wirkliche Antwort zu geben.