我采用了以下片段Visual Studio Code 的文档创建ssh-agent
登录:
if [ -z "$SSH_AUTH_SOCK" ]; then
# Check for a currently running instance of the agent
RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
if [ "$RUNNING_AGENT" = "0" ]; then
# Launch a new instance of the agent
ssh-agent -s &> .ssh/ssh-agent
fi
eval `cat .ssh/ssh-agent`
fi
但是,我发现每次登录时,ssh-agent
当我获取信息时都会创建一个新的~/.zprofile
,即使我打开了其他几个会话。
在调试问题时,我意识到调用 会eval "$(ssh-agent -s)"
创建代理并将其 PID 打印在终端上。但是,当我调用ps
、pgrep
、htop
或类似命令时,它们不会显示该ssh-agent
进程。如果我使用 重新运行相同的命令sudo
,我就可以找到该进程。
我该怎么做才能让ssh-agent
调用该流程的用户可以看到该流程,以便他们可以在所有会话中使用同一个代理?
答案1
我有类似的东西,使用用户服务要简单得多。
[Unit]
Description=SSH Authentication Agent
Documentation=man:ssh-agent
Requires=run-user-%U.mount
[Service]
Type=exec
ExecStart=/usr/bin/ssh-agent -a %t/ssh-agent.sock -D
Restart=on-failure
RuntimeDirectory=ssh
RuntimeDirectoryMode=0700
KillMode=process
KillSignal=SIGTERM
[Install]
WantedBy=default.target
您只需为用户启用该服务(systemctl --user enable --now ssh-agent.service
),它将从第一个会话开始。如果您需要为所有用户启用它,请使用systemctl --global enable ssh-agent.service
。
将其添加到~/.zprofile
(或/etc/zsh/zprofile
所有用户):
# SSH_AGENT_PID isn't really necessary since it's mainly used to terminate the agent with `ssh-agent -k`
typeset -x SSH_AGENT_PID="$( systemctl --user show --property=MainPID --value ssh-agent.service )"
typeset -x SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh/ssh-agent.sock"