ssh-agent和crontab - 有没有一个好的方法让它们相遇?
ssh-agent和crontab - 有没有一个好的方法让它们相遇?
我写了一个简单的脚本,每天晚上将svn活动日志发送给我们的开发人员。到目前为止,我在与svn仓库相同的机器上运行它,所以我不需要担心身份验证,只需使用svn的file:///地址样式即可。
现在我在家用电脑上运行脚本,访问远程仓库,所以我必须改用svn+ssh://路径。通过ssh-key的良好设置,我在正常情况下不必输入密码即可访问svn仓库。
然而,crontab无法访问我的ssh密钥/ssh-agent。我在网上看到过关于这个问题的一些解决方法,这里也提到了这个问题,但没有解决办法:
为什么从crontab执行时ssh失败,但从命令行执行时成功?
我的解决办法是在脚本顶部添加以下内容:
### 使SSH密钥正常工作的总体黑客 ### eval `ssh-agent -s`
这在MacOSX 10.6上似乎有效。
我的问题是,这种方法有多糟糕,是否有更好的方法?
SSH-Agent和crontab之间是否有一种好的方法让它们相互配合?
在我遇到类似问题时,我的脚本(依赖于ssh密钥)在我手动运行时可以正常工作,但是在crontab中运行时失败了。
手动使用以下命令定义适当的密钥
ssh -i /path/to/key
并不能解决问题。
但最终我发现,当crontab运行SSH时,SSH_AUTH_SOCK为空。我不确定为什么会这样,但我只是运行了以下命令
env | grep SSH
复制返回的值,并将这个定义添加到我的crontab头部。
SSH_AUTH_SOCK="/tmp/value-you-get-from-above-command"
我对这里发生的事情不太了解,但它解决了我的问题。现在crontab可以正常运行了。
/path/to/key是否是一个空密钥?如果不需要输入密码,我认为你不需要使用授权套接字。
请注意上面的/tmp
。这是指一个临时文件,当ssh-agent
退出或计算机关闭时将被删除。
, ssh-agent
在使用代理转发时也很有用。
, 是的,如果你有一个可以用于验证密钥的代理,无论是通过转发还是通过cron之外的其他进程,你可以引用该代理。Bryan Kennedy在手动和crontab操作之间的区别可能是由于自动化的cron作业无法访问代理。如果没有可访问的代理,可以使用不需要密码的私钥。通过在authorized_keys中使用'from'前缀,可以限制接受该密钥的客户端主机,从而增加无密码密钥的安全性。
问题的出现原因是在使用crontab执行脚本时,无法与ssh-agent进行交互,导致无法自动加载密钥。
解决方法是通过安装keychain工具,并在.bash_profile文件中添加相关代码。具体步骤如下:
1. 安装keychain工具。
2. 在.bash_profile文件中添加以下代码:keychain ~/.ssh/id_dsa。
3. 在脚本中使用以下代码加载ssh-agent环境变量:. ~/.keychain/$HOSTNAME-sh。
4. 如果使用csh或fish shell,keychain也会生成相应的代码。
5. 如果在cron脚本中使用keychain工具,可以使用keychain --noask --eval id_dsa
命令。
6. 在执行命令时,使用eval keychain --noask --eval id_dsa
命令。
这样,就可以解决ssh-agent和crontab无法配合使用的问题。
问题的原因:
ssh-agent是一个用于管理SSH密钥的进程,通过ssh-add命令将密钥添加到ssh-agent中,以便在使用SSH进行连接时自动加载密钥。而crontab是一个用于定时执行任务的工具。然而,当将ssh-agent和crontab结合使用时,会遇到一些问题。
解决方法:
为了解决这个问题,可以采取以下步骤:
1. 首先,在脚本中使用eval命令运行ssh-agent,并将其输出作为环境变量进行导入。
2. 然后,执行需要使用SSH连接的命令。
3. 最后,使用kill命令杀死SSH_AGENT_PID所指定的进程,以关闭ssh-agent。
具体的解决方法如下:
eval `ssh-agent -s` svn stuff kill $SSH_AGENT_PID
注意事项:
需要注意的是,仅仅运行ssh-agent而没有运行ssh-add命令是不能加载任何密钥的。在MacOS中,ssh-agent可能与其手册页所描述的行为不同。关于这个问题的答案可以在serverfault.com上找到。可能是由于系统密钥链中存储的密码以及在系统注销前添加的SSH密钥的组合。
此外,还要注意在使用crontab时,可能会出现多个ssh-agent进程在后台运行的情况,需要使用kill命令将其关闭。