2009-11-04 48 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