我有一台笔记本电脑,上面运行着 pageant(PuTTy SSH 密钥代理)。如果我通过 ssh 连接到系统并启动屏幕,ssh 密钥转发可以正常工作。
但是,如果我断开与该屏幕会话的连接,注销,然后重新连接——密钥转发将不再起作用。我推测这是因为当我重新连接时,新 ssh 会话的密钥转发设置在与旧 ssh 会话不同的端口上。
有没有办法教会单个屏幕窗口重新连接到代理转发,以便我可以使用我的密钥再次转发?
答案1
我的解决方案更强大一些。将其放入远程端的 .bash_profile 中。
if [ -z "${STY}" -a -t 0 ]; then
reattach () {
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-screen"
SSH_AUTH_SOCK="${HOME}/.ssh/agent-screen" export SSH_AUTH_SOCK
fi
exec screen -A -D -RR ${1:+"$@"}
}
fi
然后我使用reattach
而不是screen
。这可以使用command screen -A ${1:+"$@"}
'screen' 而不是 'reattach' 来实现。
@David Mackintosh 的回答中使用“别名”解决方案的问题在于,屏幕上运行的进程现在在远程端具有相同的 SSH_AUTH_SOCK 值。想想以下场景。
- 本地:启动 SSH 代理获取
SSH_AUTH_SOCK
值 - 本地:SSH 到远程,
SSH_AUTH_SOCK
在远程设置新值 - 远程:启动
screen
或tmux
,使用 SSH_AUTH_SOCK - 远程:创建 shell,它继承自 SSH_AUTH_SOCK
screen
- 远程:脱离屏幕并注销
- 本地:SSH 到远程,设置新的
SSH_AUTH_SOCK
遥控器上的值 - 远程:重新连接到屏幕会话,仍然有老的
SSH_AUTH_SOCK
价值
诀窍是让在屏幕内运行的进程使用新值。您可以通过SSH_AUTH_SOCK
每次调用时将符号链接重新指向当前值来实现这screen
一点(对于新的或重新连接的会话)。
答案2
这实际上是以下内容的重复:堡垒主机上的 ssh-agent 密钥与屏幕或 tmux 超时
解决方案:
添加到你的.bash_profile:
回显“导出 SSH_AUTH_SOCK=$SSH_AUTH_SOCK”>~/.ssh/auth_sock
添加到你的.bashrc:
别名 ssh="源 ~/.ssh/auth_sock ; ssh"
到目前为止这对我而言似乎是有效的。