Mic*_* H. 29 unix bash cron ssh-keys
我写了一个简单的脚本,每晚将svn活动日志邮寄给我们的开发人员.到目前为止,我已经在与svn存储库相同的机器上运行它,所以我不必担心身份验证,我可以使用svn的file:///地址样式.
现在我在家用计算机上运行脚本,访问远程存储库,所以我不得不更改为svn + ssh://路径.使用ssh-key很好地设置,我不需要在正常情况下输入访问svn存储库的密码.
但是,crontab无法访问我的ssh-keys/ssh-agent.我已经在网上的几个地方读到了这个问题,这里也提到了这个问题,没有解决方案:
我的解决方案是将其添加到脚本的顶部:
### 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的复制答案
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的行为与其手册页所说的不同.
我遇到了类似的问题.我的脚本(依赖于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现在运行顺畅.
恢复运行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).