ssh-agent和crontab - 是否有一种很好的方式来满足这些需求?

Mic*_* H. 29 unix bash cron ssh-keys

我写了一个简单的脚本,每晚将svn活动日志邮寄给我们的开发人员.到目前为止,我已经在与svn存储库相同的机器上运行它,所以我不必担心身份验证,我可以使用svn的file:///地址样式.

现在我在家用计算机上运行脚本,访问远程存储库,所以我不得不更改为svn + ssh://路径.使用ssh-key很好地设置,我不需要在正常情况下输入访问svn存储库的密码.

但是,crontab无法访问我的ssh-keys/ssh-agent.我已经在网上的几个地方读到了这个问题,这里也提到了这个问题,没有解决方案:

为什么ssh从crontab失败但在从命令行执行时成功?

我的解决方案是将其添加到脚本的顶部:

### TOTAL HACK TO MAKE SSH-KEYS WORK  ###
eval `ssh-agent -s`
Run Code Online (Sandbox Code Playgroud)

这似乎适用于MacOSX 10.6.

我的问题是,这有多糟糕,还有更好的方法吗?

Mik*_*erg 31

此外...

如果您的密钥有密码,密钥链会询问您一次(有效直到您重新启动计算机或终止ssh-agent).

钥匙扣是你需要的!只需安装它并在.bash_profile中添加以下代码:

keychain ~/.ssh/id_dsa
Run Code Online (Sandbox Code Playgroud)

因此,请在脚本中使用以下代码加载ssh-agent环境变量:

. ~/.keychain/$HOSTNAME-sh
Run Code Online (Sandbox Code Playgroud)

注意:keychain还会为csh和fish shell生成代码.

来自https://serverfault.com/questions/92683/execute-rsync-command-over-ssh-with-an-ssh-agent-via-crontab的复制答案

  • 钥匙串的主页告诉我在cron脚本中使用`keychain --noask --eval id_dsa`这对我有用 - 不确定什么是最好的.见http://www.funtoo.org/Keychain (4认同)

pra*_*pra 21

当您运行ssh-agent -s时,它会启动一个后台进程,您需要稍后终止该进程.所以,最低限度是将你的黑客改为:

eval `ssh-agent -s` 
svn stuff
kill $SSH_AGENT_PID
Run Code Online (Sandbox Code Playgroud)

但是,我不明白这个黑客是如何工作的.仅运行代理而不运行ssh-add将不会加载任何密钥.也许MacOS的ssh-agent的行为与其手册页所说的不同.


bry*_*edy 8

我遇到了类似的问题.我的脚本(依赖于ssh键)在我手动运行时工作但在使用crontab运行时失败.

手动定义适当的密钥

ssh -i /path/to/key
Run Code Online (Sandbox Code Playgroud)

没用.

但最终我发现当crontab运行SSH时,SSH_AUTH_SOCK为空.我不确定为什么,但我只是

env | grep SSH
Run Code Online (Sandbox Code Playgroud)

复制返回的值并将此定义添加到我的crontab的头部.

SSH_AUTH_SOCK="/tmp/value-you-get-from-above-command"
Run Code Online (Sandbox Code Playgroud)

我对这里发生的事情不太了解,但它解决了我的问题.crontab现在运行顺畅.

  • 注意上面的`/ tmp`.这是指当`ssh-agent`退出或计算机关闭时将删除的临时文件. (3认同)

vpk*_*vpk 6

恢复运行ssh-agent的pid和socket的一种方法是.

SSH_AGENT_PID=`pgrep -U $USER ssh-agent`
for PID in $SSH_AGENT_PID; do
    let "FPID = $PID - 1"
    FILE=`find /tmp -path "*ssh*" -type s -iname "agent.$FPID"`
    export SSH_AGENT_PID="$PID" 
    export SSH_AUTH_SOCK="$FILE"
done
Run Code Online (Sandbox Code Playgroud)

这当然假设您在系统中安装了pgrep并且只运行了一个ssh-agent,或者在多个ssh-agent的情况下,它将采用pgrep最后找到的那个.


小智 5

我的解决方案 - 基于pra的 - 稍微改进了甚至在脚本失败时杀死进程:

eval `ssh-agent`
function cleanup {
    /bin/kill $SSH_AGENT_PID
}
trap cleanup EXIT
ssh-add
svn-stuff
Run Code Online (Sandbox Code Playgroud)

请注意,我必须在我的机器上调用ssh-add(scientific linux 6).