我有一个部署用户,每分钟运行一次 cronjob 调整。
在远程服务器(部署目标)上,我没有可用的公钥,而是Could not open a connection to your authentication agent
在 ssh-add 上的部署服务器上获得了一个。
我最终将此行放入我的 .bashrc 中:
ps -u $(whoami) | grep ssh-agent &> /dev/null || (eval $(ssh-agent) && ssh-add)
尽管我理解不应该这样,但 cronjob 每次都会打开一个新的 ssh-agent。在创建内核日志 14-16 小时后,服务器内存耗尽很多像这样的条目:
Aug 12 21:50:58 tools kernel: [64021.568750] [25668] 1000 25668 2654 81 9 0 0 ssh-agent
...我必须重新启动它。
如何将正在运行的 ssh-agent 进程数限制为一个,或者在结束 cronjob 后终止该进程?
更新
给出的答案完全没问题,我刚刚发现eval ssh-add
crontab 中还有另一个。我将用赏金来奖励给出的问题。
答案1
要终止 ssh-agent 进程,您只需简单地使用该ssh-agent -k
命令即可。
但是,您可能会收到以下错误消息:
SSH_AGENT_PID 未设置,无法终止代理
这与子壳括号内的命令调用的变量。父 shell 无法看到子 shell 中生成的变量,因此 SSH_AGENT_PID 为空。
您可以将单行代码更改为:
ps -u $(whoami) | grep ssh-agent &> /dev/null
if [ $? -ne 0 ];then
eval $(ssh-agent)
ssh-add
fi
trap 'ssh-agent -k; exit' 0
最后一行将在您退出系统时为您终止代理。
但请注意,这仅适用于一个会话,比如说,如果您使用第二个会话登录,那么第二个会话将不会得到您在第一个会话中授权的 ssh-agent 的认可。您需要通过在第二个会话中导出 SSH_AGENT_PID 和 SSH_AUTH_SOCK 来解决这个问题,以使其工作。您可以通过将这两个变量打印到一个临时文件中,并将其加载到 .bashrc 中来实现这一点,这是一个简单示例:
ps -u $(whoami) | grep ssh-agent &> /dev/null
if [ $? -ne 0 ];then
eval $(ssh-agent)
ssh-add
echo "export SSH_AGENT_PID=$SSH_AGENT_PID" > ~/.agent-profile
echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> ~/.agent-profile
else
source ~/.agent-profile
fi
trap 'ssh-agent -k; exit' 0
玩得开心。
编辑:
在您的 .bashrc 中尝试此操作之前,请不要忘记终止所有 ssh-agent,否则它将无法调用 ssh-agent,因为已经有一个正在运行的 ssh-agent。
答案2
我使用了解决方案 2(source ~/.agent-profile)。在终止 ssh-agent 进程之前,它对我有用。两天后,我终止了所有过去的 ssh-agent 进程。每次登录时都会出现以下错误,并且 ssh-agent 进程的数量都会增加。
[用户名@i3-dljump01 ~]$ logout kill: 没有此进程