【问题标题】:Accessing SSH key from bash script running via a cron job从通过 cron 作业运行的 bash 脚本访问 SSH 密钥
【发布时间】:2009-11-04 11:01:55
【问题描述】:

我把这个脚本放在一起,每天更新一个分叉的 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

一般来说,这可能是一种效率极低的方法,但它确实有效,但我从未见过。如果我能让它使用我的信誉,我会很高兴。

【问题讨论】:

    标签: bash scripting ssh cron github


    【解决方案1】:

    我相信您使用了错误的引号。普通引用 ssh-agent 不做任何事情,您需要通过使用 command substitution 将运行它的结果合并到:

    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 中的主机位。现在它起作用了!谢谢
    【解决方案2】:

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

    为此,您需要创建一个passphraseless key 并从 cron 作业中使用它。使用无密码密钥时会出现通常的安全警告。

    【讨论】:

    • 我将如何指示脚本使用该特定密钥连接到 github?
    • 对 ssh 使用 -i 选项,或设置一个 ~/.ssh/config 文件,该文件指示您要连接到的主机使用哪个密钥文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2011-01-23
    • 2010-09-14
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多