2009-11-04 21 views
6

Ich habe dieses Skript zusammengestellt, um täglich einen Ordner mit verzweigten Github-Repositorys zu aktualisieren. Es läuft gut, wenn ich es von einer Eingabeaufforderung aus anrufe, aber ich kann herausfinden, wie es meine id_rsa zuverlässig nutzen kann, wenn es als Cron-Job ausgeführt wird. Die eval 'ssh-agent' ist ein Versuch, genau das zu tun, aber es hat keinen positiven Effekt gesehen.Zugriff auf den SSH-Schlüssel aus einem Bash-Skript, das über einen Cron-Job ausgeführt wird

#!/bin/sh 
LOGPATH=log.txt 
eval 'ssh-agent' 
cd /path/to/update/folder 
echo "-------START UPDATE-------">$LOGPATH 
echo "Updating repos:">>$LOGPATH 
date "+%F %T">>$LOGPATH 
COUNT=1 
find . -maxdepth 1 -type d | while read dir; do 
cd "$dir" 
LEN=$"${#dir}" 
if [ $LEN != "1" ] 
    then 
    echo "*********">>$LOGPATH 
    echo "$COUNT. " ${dir:2}>>$LOGPATH 
    /usr/local/bin/git pull upstream master>>$LOGPATH 2>> $LOGPATH 
    /usr/local/bin/git push origin master>>$LOGPATH 2>> $LOGPATH 
    let COUNT=COUNT+1 
fi 
cd "$OLDPWD" 
done 
echo "-------END UPDATE-------">>$LOGPATH 
exit 0 

Dies ist wahrscheinlich ein schrecklich ineffizient Weg über den Prozess im Allgemeinen zu gehen, aber es funktioniert und ich immer es nicht sehen. Wenn ich es schaffen könnte, meine Kreditwürdigkeit zu nutzen, wäre ich begeistert.

Antwort

7

Ich glaube, Sie verwenden die falsche Art von Anführungszeichen. Plain-Zitat ssh-agent nichts tun, müssen Sie die Ergebnisse zu übernehmen davon läuft durch die Verwendung Befehl Substitution mit:

eval `ssh-agent` 

oder

eval $(ssh-agent) 

Dies bewirkt, dass das Skript setzen die benötigten Umgebungsvariablen. ssh-agent hat jedoch immer noch keine Schlüssel außer Sie ssh-add sie. Wenn Ihre Schlüssel keine Passphrase haben, kann ssh-add einfach aus dem Skript ausgeführt werden.

Wenn Ihr privater Schlüssel eine Passphrase enthält, möchten Sie dieses Skript möglicherweise als Daemon und nicht als Cron-Job ausführen. Dadurch können Sie sich mit dem Agenten verbinden und Ihre privaten Schlüssel hinzufügen.

Der eigentliche Grund dafür, dass das Skript über die Befehlszeile ausgeführt wird, besteht darin, dass Ihre Desktopumgebung wahrscheinlich ssh-agent ausführt und dafür sorgt, dass die erforderlichen Umgebungsvariablen an alle Terminalfenster weitergegeben werden. (Entweder indem Sie sie zu Kindern machen und die Variablen erben oder indem Sie Ihre Shell mit den erforderlichen Befehlen versorgen.) Ich nehme an, Sie laufen ssh-add irgendwann in Ihrem normalen Workflow?

+0

Ich habe noch nie ssh-add ausgeführt, aber ich bin auf OS X, also ist meine Vermutung alles, was für mich passiert. Das Erstellen eines Schlüssels ohne Passphrase und die Verwendung von ssh-add scheint der Zweck gewesen zu sein. Ich habe auch die Host-Bits in .ssh/config wie Greg vorgeschlagen. Jetzt funktioniert es! Vielen Dank –

2

Der Prozess ssh-agent bietet nur eine Möglichkeit zur Verwendung mit ssh-add, um Ihre Passphrase hinzuzufügen. Es stellt Ihren Schlüssel nicht automatisch zur Verfügung (Ihr privater Schlüssel kann nicht ohne Ihre Passphrase entschlüsselt werden).

Um dies zu tun, müssen Sie eine passphraseless key erstellen und diese aus dem Cron-Job verwenden. Die üblichen Sicherheitswarnungen gelten bei Verwendung von Passphraseless-Schlüsseln.

+0

Wie würde ich das Skript anweisen, diesen bestimmten Schlüssel für die Verbindung zu github zu verwenden? –

+2

Verwenden Sie die Option -i für ssh, oder richten Sie eine Datei "~/.ssh/config" ein, die angibt, welche Schlüsseldatei für die Hosts verwendet werden soll, mit denen Sie eine Verbindung herstellen. –

Verwandte Themen