如何在bash中检查ssh-agent是否已经运行?

89

我在我的Linux环境中有一个示例sh脚本,基本上是为当前shell运行ssh-agent,将一个密钥添加到其中并运行两个git命令:

#!/bin/bash
eval "$(ssh-agent -s)"
ssh-add /home/duvdevan/.ssh/id_rsa

git -C /var/www/duvdevan/ reset --hard origin/master
git -C /var/www/duvdevan/ pull origin master

脚本实际上运行得很好,但每次运行它时,我都会得到一个新的进程,所以我认为这可能会成为性能问题,并且最终可能会有无用的进程存在。

输出示例:

Agent pid 12109
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment)

此外,是否可以找到现有的 ssh-agent 进程并将我的密钥添加到其中?


4
请尝试使用 $SSH_AGENT_PID - choroba
1
我不能这样做,因为每天需要多次登录到计算机上,不止是我一个人,还有其他人。 - Zlatan Omerović
在注销时终止代理,或者使用代理转发仅在本地计算机上运行代理,如果您正在ssh到该计算机。 - chepner
另一种变体是通过 ps aux | grep ssh-agent 检查是否有任何代理进程正在运行。如果您将其进一步传输到 | wc -l,并且这个值等于“0”,则不再有运行中的进程。 - MichaelHuelsen
你可能会认为代理本身会有一个内置选项,只有在没有运行时才运行新进程...但是不,我们必须编写一些复杂的脚本! - ADTC
显示剩余5条评论
14个回答

0

检查ssh-agent(或任何其他程序)运行的进程数量的非常简单的命令: pidof ssh-agent 或者: pgrep ssh-agent

杀死ssh-agent(或任何其他程序)所有进程的非常简单的命令: kill $(pidof ssh-agent)


0
我编写了这个Bash函数来计算并返回正在运行的ssh-agent进程的数量... 它使用procfs搜索ssh-agent进程,而不是使用$ ps -p $SSH_AGENT_PID:cmd或$SSH_AUTH_SOCK:var ...(这些ENV-var.仍然可以设置为旧值,而ssh-agent的进程已经被杀死:如果使用$ ssh-agent -k$ $(ssh-agent -k)而不是$ eval $(ssh-agent -k)
function count_agent_procfs(){
    declare -a agent_list=( ) 
    for folders in $(ls -d /proc/*[[:digit:]] | grep -v /proc/1$);do
        fichier="${folders}/stat"
        pid=${folders/\/proc\//}
        [[ -f ${fichier} ]] && [[ $(cat ${fichier} | cut -d " " -f2) == "(ssh-agent)" ]] && agent_list+=(${pid})
    done
    return ${#agent_list[@]}
}

然后,如果有很多ssh-agent进程在运行,您可以使用以下列表获取它们的PID:"${agent_list[@]}"


0
AndrewD的回答在大多数情况下对我最有帮助,但我发现当$SSH_AGENT_PID未设置或不存在时,ps命令会响应错误:
error: list of process IDs must follow -p

为了解决这个问题,我们需要检查$SSH_AGENT_PID变量的存在性,这样条件语句就会变成:
if [ -n "$SSH_AGENT_PID" ] && ps -p "$SSH_AGENT_PID" > /dev/null

整个修改后的代码片段:
if [ -n "$SSH_AGENT_PID" ] && ps -p "$SSH_AGENT_PID" > /dev/null
then
   echo "ssh-agent is already running"
   # Do something knowing the pid exists, i.e. the process with $PID is running
else
eval `ssh-agent -s`
fi

简短且修订版:

if ! [ -n "$SSH_AGENT_PID" ] || ! ps -p "$SSH_AGENT_PID" > /dev/null
then
    eval "$(ssh-agent -s)"
fi

ssh-add ~/.ssh/github_ed25519

0

您可以修改第一行为:

PID_SSH_AGENT=`eval ssh-agent -s | grep -Po "(?<=pid\ ).*(?=\;)"`

在脚本的末尾,您可以执行以下操作:
kill -9 $PID_SSH_AGENT

2
首先,$varname是一个变量的引用,不能这样设置。其次,如果“eval ssh-agent”已经设置了$SSH_AGENT_PID,为什么你还想这样做呢? - Friek
抱歉,我不知道它设置了那个变量。是的,$ 不应该在那里。谢谢。 - alok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接