SSH-Agent und Crontab-Gibt es eine gute Möglichkeit, diese zu treffen?
Frage
Ich habe ein einfaches Skript geschrieben, das die SVN -Aktivitätsprotokolle abends an unsere Entwickler verschickt. Bis jetzt habe ich es auf dem gleichen Computer wie das SVN -Repository ausgeführt, daher musste ich mir keine Sorgen um die Authentifizierung machen, ich konnte nur die Datei von SVN verwenden: /// Adressstil.
Jetzt führe ich das Skript auf einem Heimcomputer aus und greife auf ein Remote -Repository zu, also musste ich mich zu SVN+SSH: // Pfaden ändern. Wenn SSH-Key gut eingerichtet ist, muss ich unter normalen Umständen nie Passwörter für den Zugriff auf das SVN-Repository eingeben.
Crontab hatte jedoch keinen Zugang zu meinem SSH-Keys / SSH-Agent. Ich habe ein paar Orte im Internet über dieses Problem gelesen, und es wird auch hier ohne Auflösung angedeutet:
Warum scheitert SSH an Crontab, aber erklappt, wenn sie aus einer Befehlszeile ausgeführt werden?
Meine Lösung bestand darin, dies an die Spitze des Skripts hinzuzufügen:
### TOTAL HACK TO MAKE SSH-KEYS WORK ###
eval `ssh-agent -s`
Dies scheint unter macOSX 10.6 zu funktionieren.
Meine Frage ist, wie schrecklich ist das und gibt es einen besseren Weg?
Lösung
Wenn Sie SSH -Agent -S ausführen, wird ein Hintergrundprozess gestartet, den Sie später töten müssen. Das Minimum besteht also darin, Ihren Hack in so etwas zu ändern:
eval `ssh-agent -s`
svn stuff
kill $SSH_AGENT_PID
Ich verstehe jedoch nicht, wie dieser Hack funktioniert. Einfach einen Agenten ausführen, ohne auch SSH-ADD auszuführen, lädt keine Schlüssel. Vielleicht verhält sich Macos 'SSH-Agent anders als seine Handbuch Seite sagt, es tut es.
Andere Tipps
Zusätzlich...
Wenn Ihr Schlüssel über eine Pashphrase verfügt, fragt Keychain Sie einmal (gültig, bis Sie die Maschine neu starten oder das SSH-Agent töten).
Schlüsselbund ist das, was Sie brauchen! Installieren Sie es einfach und fügen Sie den folgenden Code in Ihr .bash_profile hinzu:
keychain ~/.ssh/id_dsa
Verwenden Sie also den folgenden Code in Ihrem Skript, um die SSH-Agent-Umgebungsvariablen zu laden:
. ~/.keychain/$HOSTNAME-sh
HINWEIS: Der Schlüsselbund generiert auch Code für CSH- und Fischschalen.
Kopierte Antwort von https://serverfault.com/questions/92683/execute-rsync-command-over-ssh-with-an-ssh-agent-via-crontab
Ich hatte ein ähnliches Problem. Mein Drehbuch (das sich auf SSH -Schlüssel stützte) funktionierte, als ich es manuell lief, aber beim Lauf mit Crontab fehlgeschlagen war.
Manuell definieren den entsprechenden Schlüssel mit
ssh -i /path/to/key
hat nicht funktioniert.
Aber schließlich fand ich heraus, dass der ssh_auth_sock leer war, als der Crontab SSH lief. Ich war mir nicht genau sicher, warum, aber ich nur
env | grep SSH
kopierte den zurückgegebenen Wert und fügte diese Definition dem Kopf meines Crontabs hinzu.
SSH_AUTH_SOCK="/tmp/value-you-get-from-above-command"
Ich bin nicht mehr in der Tiefe, was hier passiert, aber es hat mein Problem behoben. Der Crontab läuft jetzt reibungslos.
Eine Möglichkeit, die PID und den Sockel des laufenden SSH-Agent wiederherzustellen, wäre.
SSH_AGENT_PID=`pgrep -U $USER ssh-agent`
for PID in $SSH_AGENT_PID; do
let "FPID = $PID - 1"
FILE=`find /tmp -path "*ssh*" -type s -iname "agent.$FPID"`
export SSH_AGENT_PID="$PID"
export SSH_AUTH_SOCK="$FILE"
done
Dies setzt natürlich voraus, dass Sie PGREP im System installiert haben, und es wird nur ein SSH-Agent ausgeführt, oder bei mehreren Fällen wird derjenige benötigt, den PGREP zuletzt findet.
Meine Lösung - basierend auf PRAs - verbessert sich etwas, um den Prozess selbst beim Skriptfehler zu töten:
eval `ssh-agent`
function cleanup {
/bin/kill $SSH_AGENT_PID
}
trap cleanup EXIT
ssh-add
svn-stuff
Beachten Sie, dass ich SSH-ADD auf meiner Maschine anrufen muss (Scientific Linux 6).
Angenommen, Sie haben bereits SSH -Einstellungen konfiguriert und das Skript funktioniert einwandfrei vom Terminal unter Verwendung der Schlüsselbund ist definitiv der einfachste Weg, um sicherzustellen, dass das Skript auch in Crontab gut funktioniert.
Da Keychain in den meisten UNIX/Linux -Ableitungen nicht enthalten ist, ist hier die schrittweise Prozedur.
1. Laden Sie das entsprechende RPM -Paket ab, abhängig von Ihrer Betriebssystemversion von http://pkgs.repoforge.org/keychain/. Beispiel für CentOS 6:
wget http://pkgs.repoforge.org/keychain/keychain-2.7.0-1.el6.rf.noarch.rpm
2. Installieren Sie das Paket:
sudo rpm -Uvh keychain-2.7.0-1.el6.rf.noarch.rpm
3. Generieren Sie Keychain -Dateien für Ihren SSH -Schlüssel. Sie befinden sich im ~/.Keychain -Verzeichnis. Beispiel für ID_RSA:
keychain ~/.ssh/id_rsa
4. Fügen Sie Ihrem Skript überall vor dem ersten Befehl die folgende Zeile hinzu, die die SSH -Authentifizierung verwendet:
source ~/.keychain/$HOSTNAME-sh
Ich persönlich versuchte, dafür zusätzliche Programme zu vermeiden, aber alles andere, was ich versucht habe, hat nicht funktioniert. Und das hat gut funktioniert.
Um automatisierte Prozesse ohne automatisierte Kennwort-/Passphrase -Hacks einzurichten, verwende ich eine separate Identitätsdatei, die keine Passphrase hat, und beschränke die Einträge der Zielgeräte von Authorized_Keys, die vorangestellt sind from="automated.machine.com" ...
etc..
Ich habe einen öffentlich-privaten Keyset für die Sendungsmaschine ohne Passphrase erstellt:
ssh-keygen -f .ssh/id_localAuto
(Drücken Sie die Rückgabe, wenn Sie nach einer Passphrase aufgefordert werden)
Ich habe einen Remoteauto -Host -Eintrag in eingerichtet .ssh/config
:
Host remoteAuto
HostName remote.machine.edu
IdentityFile ~/.ssh/id_localAuto
und die remote.maachine.edu:.sssh/authorized_keys mit:
...
from="192.168.1.777" ssh-rsa ABCDEFGabcdefg....
...
Dann benötigt SSH die extern authentifizierte Autorisierung nicht von SSH-Agent oder Schlüsselbund, sodass Sie Befehle verwenden können wie:
scp -p remoteAuto:watchdog ./watchdog_remote
rsync -Ca remoteAuto/stuff/* remote_mirror
svn svn+ssh://remoteAuto/path
svn update
...
Inspiriert von einigen anderen Antworten hier (insbesondere von VPK), habe ich den folgenden Crontab -Eintrag ausgearbeitet, für das kein externes Skript erforderlich ist:
PATH=/usr/bin:/bin:/usr/sbin:/sbin
* * * * * SSH_AUTH_SOCK=$(lsof -a -p $(pgrep ssh-agent) -U -F n | sed -n 's/^n//p') ssh hostname remote-command-here
Hier ist eine Lösung, die funktioniert, wenn Sie Keychain nicht verwenden können und wenn Sie kein SSH-Agent von Ihrem Skript aus starten können (z. B., da Ihr Schlüssel passphrase geschützt ist).
Führen Sie das einmal aus:
nohup ssh-agent > .ssh-agent-file &
. ssh-agent-file
ssh-add # you'd enter your passphrase here
In dem Skript, das Sie aus Cron ausführen:
# start of script
. ${HOME}/.ssh-agent-file
# now your key is available
Natürlich ermöglicht dies jedem, der "~/.ssh-Agent-File" und den entsprechenden Socket lesen kann, um Ihre SSH-Anmeldeinformationen zu verwenden. Verwenden Sie daher mit Vorsicht in jeder Umgebung mit mehreren Benutzern.
Ihre Lösung funktioniert, wird jedoch jedes Mal einen neuen Agentenprozess hervorrufen, wie bereits eine andere Antwort angezeigt.
Ich hatte ähnliche Probleme und fand das Blogeintrag nützlich sowie das Shell -Skript von Wayne Walker im Blog auf Github.
Viel Glück!