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?

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top