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

6

我编写了这个脚本来每天更新一组Fork的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个回答

7

我认为您使用了错误的引号。 普通引用ssh-agent不起作用,您需要使用命令替换将其运行结果结合起来,例如:

eval `ssh-agent`

或者

eval $(ssh-agent)

这会导致脚本设置所需的环境变量。然而,ssh-agent仍然没有任何密钥,除非您将它们添加到ssh-add中。如果您的密钥没有密码,那么可以从脚本中简单地运行ssh-add

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

脚本能够在命令行中工作的真正原因是,您的桌面环境可能正在运行ssh-agent,并且它会安排传播所有终端窗口所需的环境变量。(通过使它们成为子进程并继承变量或通过使您的shell源代码中包含必要的命令)。我猜您在正常工作流程中某个时刻运行了ssh-add


我从未运行过ssh-add,但我使用的是OS X,所以我猜这对我来说就是发生的一切。创建一个没有密码的密钥并使用ssh-add似乎已经解决了问题。我还按照Greg的建议在.ssh/config中进行了主机位设置。现在它可以工作了!谢谢。 - Joel Hooks

2

ssh-agent进程只提供了一个与ssh-add一起使用的工具,用于添加您的密码。它不会自动使您的密钥可用(没有密码短语,无法解密私钥)。

为此,您需要创建一个无密码短语的密钥并从cron作业中使用它。当使用无密码短语的密钥时,请遵循通常的安全警告。


我该如何指示脚本使用特定的密钥连接到GitHub? - Joel Hooks
2
使用-i选项连接ssh,或者设置一个~/.ssh/config文件来指定连接到的主机要使用哪个密钥文件。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接