由于ssh-agent进程数量的增加,服务器被杀死

我有一个部署用户,每分钟运行一次cronjob调整。

在远程服务器(部署目标)上,我没有可用的公钥,而是在ssh-add上Could not open a connection to your authentication agent部署服务器上的Could not open a connection to your authentication agent

我最后把这行放到我的.bashrc:

 ps -u $(whoami) | grep ssh-agent &> /dev/null || (eval $(ssh-agent) && ssh-add) 

尽管不应该在我的理解中,cronjob每次都会打开一个新的ssh-agent。 14-16小时后,服务器在创建包含大量条目的kern日志后内存不足:

 Aug 12 21:50:58 tools kernel: [64021.568750] [25668] 1000 25668 2654 81 9 0 0 ssh-agent 

……我必须重新启动它。

如何在结束cronjob后将运行ssh-agent进程的数量限制为一个或终止进程?

更新给定的答案完全正常,我发现我在crontab中有另一个eval ssh-add 。 我将用赏金奖励给定的问题。

要终止ssh-agent进程,只需使用ssh-agent -k命令即可。

但是,您可能会收到以下错误消息:

没有设置SSH_AGENT_PID,无法杀死代理

它与您的命令在括号内调用的子shell相关。 父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。