从通过cron作业运行的bash脚本访问SSH密钥

时间:2009-11-04 02:36:50

标签: bash scripting ssh cron github

我已经将这个脚本放在一起,每天更新一个forked Github存储库的文件夹。如果我从提示符调用它,它运行正常,但我可以'弄清楚当它作为一个cron作业运行时如何使它可靠地利用我的id_rsa。 eval 'ssh-agent'试图做到这一点,但没有看到任何积极的影响。

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

这可能是一个非常低效的方式来进行整个过程,但它有效,我从来没有看到它。如果我可以使用我的信用卡,我会很高兴。

2 个答案:

答案 0 :(得分:7)

我相信你使用了错误的报价。简单引用ssh-agent不执行任何操作,您需要使用命令替换合并运行它的结果:

eval `ssh-agent`

eval $(ssh-agent)

这会导致脚本设置所需的环境变量。但是,ssh-agent除非您ssh-add,否则仍然没有任何密钥。如果您的密钥没有密码短语,则只需从脚本中运行ssh-add即可。

如果您的私钥确实有密码短语,您可能希望将此脚本作为守护程序而不是cron作业运行。这将允许您连接到代理并添加您的私钥。

脚本在命令行中运行的真正原因是您的桌面环境可能正在运行ssh-agent,并且它会安排将所需的环境变量传播到所有终端窗口。 (要么让他们成为孩子并继承变量,要么让你的shell获得必要的命令。)我猜你在正常工作流程中的某个时刻正在运行ssh-add

答案 1 :(得分:2)

ssh-agent进程仅提供与ssh-add一起使用以添加密码的工具。它不会自动使您的密钥可用(如果没有您的密码,您的私钥就无法解密)。

为了做到这一点,您需要创建一个passphraseless key并使用cron作业中的那个。使用无密码密钥时,通常会发出安全警告。