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
时的安全注意事项:
我使用 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
时的安全注意事项: