创建代理后,它会自动与父进程分离。
someUser@MyPC:~$ eval "$(ssh-agent -s)"
Agent pid 10222
someUser@MyPC:~$ ps -e --forest | grep ssh-agent
10222 ? 00:00:00 ssh-agent
当我关闭终端并打开一个新终端来创建另一个代理时,现在有两个代理正在运行。
someUser@MyPC:~$ eval "$(ssh-agent -s)"
Agent pid 10503
someUser@MyPC:~$ ps -e --forest | grep ssh-agent
10222 ? 00:00:00 ssh-agent
10503 ? 00:00:00 ssh-agent
是否有一个命令可以连接现有的 ssh-agent,只要某个控制终端不关闭或终止它?
答案1
当您启动 时ssh-agent
,它将为您提供两个环境变量:SSH_AUTH_SOCK
和SSH_AGENT_PID
。这就是为什么您需要eval "$(...)"
命令周围来启动代理:它输出 shell 命令来设置变量,并eval
导致这些命令在当前 shell 会话中执行。
要与现有代理连接,请将SSH_AUTH_SOCK
环境变量设置为指向现有代理的套接字。为此,您可以在启动后将变量及其值输出到文件中,以便其他终端可以从那里获取它们。
例如:
eval "$(ssh-agent -s)"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/.ssh_auth_sock_info
然后在另一个终端中获取代理连接信息:
. ~/.ssh_auth_sock_info
同样,该SSH_AGENT_PID
变量将包含代理的 PID,因此您可以在注销脚本等中使用它来终止代理。
如果您知道代理 PID 但不知道套接字路径,并且您具有使用所需的权限lsof
,则可以使用它来查找套接字。例如,在运行中sudo lsof -p 10222
,您将看到第一个 SSH 代理的打开文件和套接字。通常,文件描述符 #3 是代理套接字。