由于 ssh-agent 进程数量增加,服务器被终止

由于 ssh-agent 进程数量增加,服务器被终止

我有一个部署用户,每分钟运行一次 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-addcrontab 中还有另一个。我将用赏金来奖励给出的问题。

答案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: 没有此进程

相关内容