2009-11-04 90 views
6

我已經將這個腳本放在一起,每天更新一個分叉的Github存儲庫文件夾。如果我從提示中調用它,它運行良好,但我可以'弄清楚如何使它在作爲cron作業運行時可靠地使用我的id_rsa。 eval 'ssh-agent'就是試圖做到這一點,但它沒有任何積極的影響。從通過cron作業運行的bash腳本訪問SSH密鑰

#!/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 

這可能是要走對一般的過程中效率極其低下的方式,但它的作品,我沒有見過它。如果我能得到它用我的信譽,我會興高采烈。

回答

7

我相信你使用的是錯誤的引號。純引用的ssh-agent沒有做任何事情,你需要使用命令替換與納入運行它的結果:

eval `ssh-agent` 

eval $(ssh-agent) 

這將導致腳本設置所需的環境變量。但是,ssh-agent仍然不會有任何密鑰,除非你ssh-add他們。如果您的密鑰沒有密碼,則ssh-add可以簡單地從腳本運行。

如果您的私鑰確實有密碼,您可能希望將此腳本作爲守護程序而不是cron作業運行。這將允許您連接到代理並添加您的私鑰。

腳本從命令行工作的真正原因是您的桌面環境可能正在運行ssh-agent並且它會安排所需的環境變量傳播到您的所有終端窗口。 (通過使它們成爲孩子並繼承變量或通過讓she​​ll獲得必要的命令)。我猜你正在運行ssh-add在正常工作流程的某個時間點?

+0

我從來沒有跑過ssh-add,但是我在OS X上,所以我的猜測就是我所發生的一切。創建沒有密碼的密鑰並使用ssh-add似乎已經成功了。 Greg也建議,我還在.ssh/config中完成了主機位。現在它工作了!謝謝 – 2009-11-04 03:11:40

2

ssh-agent過程只提供了一個工具來使用ssh-add添加您的密碼。它不會自動使您的密鑰可用(如果沒有密碼,您的私鑰將無法解密)。

爲了做到這一點,您需要創建一個passphraseless key並使用cron作業。使用無密碼鍵時通常會出現安全警告。

+0

我將如何指示腳本使用特定的鍵連接到github? – 2009-11-04 02:48:27

+2

使用-i選項ssh,或者設置一個'〜/ .ssh/config'文件,該文件指出要連接到的主機使用哪個密鑰文件。 – 2009-11-04 02:51:21