bash 脚本中的 ssh-agent 导致许多死进程

ssh-agent in bash script causes many dead processes

我使用 bash 脚本 (deploy.sh) 将我的应用程序部署到共享主机。作为部署过程的一部分,我使用以下脚本从 bitbucket 克隆最新代码:

eval `ssh-agent -s`
ssh-add ~/.ssh/SHA256-XXX.priv
git clone git@bitbucket.org:username/gng2.git --branch $branchname --single-branch

似乎这个脚本在共享主机上导致了很多“死”进程,当我达到限制时,我的应用程序不再工作,因为没有更多的空闲进程。请在下面查看一些死进程的示例:

699      65313  0.0  0.0   7112  1752 ?        Ss   Jan04   0:00 ssh-agent -s
699      67925  0.0  0.0   7112  1744 ?        Ss   Feb07   0:00 ssh-agent -s
699      70469  0.0  0.0   7112  1612 ?        Ss   Jan04   0:00 ssh-agent -s
699      71078  0.0  0.0   7112  2352 ?        Ss   Feb10   0:00 ssh-agent -s 

托管公司的支持团队帮助追踪死进程是由我的部署脚本启动的:

u201-gsoxvughqohx@gfra1.hosting.eu:~$ grep -ril "ssh-agent" .
./www/example.com/gng2-core/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php
./www/example.com/gng2-core/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php
./www/example.com/gng2-core/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php
./www/example.com/repos/gng2/deploy/scripts/deploy.sh
./www/example.com/repos/deploy.sh

This 文章建议我的脚本可能“生成一个不同的 ssh-agent 实例,即使在注销后,它仍然 运行 内存中添加的密钥,除非明确杀死”

我需要如何更改我的脚本以使其不会创建那么多(死)进程?我可以简单地在我的脚本末尾添加以下内容来解决这个问题吗?

eval `ssh-agent -k`

或者这个问题有更好的解决办法吗?

您的脚本可能不应该启动 ssh-agent;它应该使用已经是 运行 的 ssh-agent。这样,用户 负责启动一个可以被多次调用脚本使用的代理。

不过,您可以做的最简单的事情就是添加其中一个

kill $SSH_AGENT_PID

ssh-agent -k

到脚本末尾以终止刚刚启动的代理。 eval 命令所做的其中一件事是将 SSH_AGENT_PID 的值设置为 just-started 代理的进程 ID。

(如果您出于某种原因有多个并发代理,那么前者很有用,这样您就可以杀死正确的代理。)

必须小心处理多重折叠:

首先检查 ssh-agent 是否可用

#!/usr/bin/env bash

# Limit risk of leaving script with an ssh key unlocked
# Keep in mind that SIGKILL cannot be trapped, so it is not 100% abuse-proof
# So remove all pending authorizations
trap 'ssh-add -D 2>/dev/null"' EXIT INT

# Spawn an ssh agent for a limited time only if none already available
if [ -z "$SSH_AUTH_SOCK" ] && [ -z "$SSH_AGENT_PID" ] ! ; then
  # Runs the agent only for the next 5 minutes
  eval "$(ssh-agent -t 600)"
fi

# Now that we know an ssh-agent is available
# we can register our ssh key with an expiration timeout
# so the authentication does not remain exposed for too long
ssh-add -t 600 # expire in 5 minutes

关于使用ssh-agent时的安全注意事项:

https://goteleport.com/blog/how-to-use-ssh-agent-safely/