我在 tty2 上有一个 bash 会话,并且有一个ssh-agent
来自上一个会话 (TTY = ?) 的属于我的进程(相同的用户 ID)
在 tty2 上,ssh-add
说:
Could not open a connection to your authentication agent.
eval $(ssh-agent)
即使已经有一个进程正在运行,我每次登录时都必须启动吗ssh-agent
?但最后,我将ssh-agent
运行许多流程实例:-(
编辑:我想使用我已经运行的ssh-agent
进程。
我找到了一种联系我已经跑步的方法ssh-agent
,如下所示:
export SSH_AUTH_SOCK=$(find /tmp/ssh-*/ -user $USER -type s -name "agent.*" 2>/dev/null | head -1)
export SSH_AGENT_PID=$(echo $SSH_AUTH_SOCK | cut -d. -f2)
但我不确定这是否非常安全。
编辑2:每次我运行此命令时,该命令eval $(ssh-agent)
都会启动一个新的进程实例:-(ssh-agent
答案1
您可以同时评估并保存 ssh-agent 输出,
eval $(ssh-agent | tee agent.env)
然后从其他终端或后续会话,
source agent.env
收紧权限以稍微更安全,
chmod go-rwx agent.env
答案2
首先,您是通过 ssh 会话执行此操作吗?如果是这样,那么您可以使用甚至不使用 ssh-agent。该选项会将主机的 ssh 代理转发到远程服务器。然后您甚至不需要将 ssh 密钥复制到远程服务器。ssh -A [email protected]
-A
回到最初的问题:运行的问题ssh-agent
是默认情况下它每次都会使用不同的随机套接字名称。您想要做的是使用ssh-agent -a
提供固定插座的选项。那么无论你调用多少次,它都不会启动另一个 ssh-agent。
这是一个简单的脚本,它将始终重复使用相同的 ssh-agent,或者在 ssh-agent 未运行时启动它。您也可以轻松地将这 3 行组合成 1 行别名。
# set SSH_AUTH_SOCK env var to a fixed value
export SSH_AUTH_SOCK=~/.ssh/ssh-agent.sock
# test whether $SSH_AUTH_SOCK is valid
ssh-add -l 2>/dev/null >/dev/null
# if not valid, then start ssh-agent using $SSH_AUTH_SOCK
[ $? -ge 2 ] && ssh-agent -a "$SSH_AUTH_SOCK" >/dev/null