恢复中断的屏幕会话时重新连接 SSH 代理转发

Reconnecting SSH Agent forwarding when resuming an interrupted screen session

所以事实证明这对google来说是一件非常困难的事情。我有一个工作设置,我 运行 在一天结束时休眠或关闭笔记本电脑的所有东西。这样做显然会切断我在 PuTTY 中的 SSH 会话。经过一番探索后,我发现了一种在通过 PuTTY 连接时自动启动屏幕并拾取断开连接的会话的好方法(即,将 if [ -z "$STY" ]; then screen -R; fi 添加到我的 .bashrc 的末尾)。

效果很好,但我仍然有问题。我在我的笔记本电脑(我最初输入密码的地方)上通过 Pageant 使用 SSH 代理转发到辅助服务器。据我所知,当 PuTTY 会话中断时,此套接字已损坏,并且在重新加载 并重新连接到屏幕时不会重新连接

这是我的测试:

20:01:38 {~/test}$ git clone git@github.com:coldcandor/env.git
Cloning into 'env'...
remote: Counting objects: 1105, done.
remote: Total 1105 (delta 0), reused 0 (delta 0), pack-reused 1105
Receiving objects: 100% (1105/1105), 341.06 KiB | 453.00 KiB/s, done.
Resolving deltas: 100% (544/544), done.
Checking connectivity... done.
20:01:43 {~/test}$ rm -rf env

断开 PuTTY 并重新连接

20:01:58 {~/test}$ git clone git@github.com:coldcandor/env.git
Cloning into 'env'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

如您所见,它不会保留转发。但是,如果我不重新连接到屏幕,或者在重新连接后完全退出并重新打开屏幕,那么就可以了。

我该如何解决这个问题?

screen 保留了第一次连接的环境变量,套接字断开连接。新 ssh 会话会为您创建一个新套接字,但该会话的环境变量 $SSH_AUTH_SOCK 会被 screen 覆盖。

如何退出的简洁方法是将此变量保存到恢复的屏幕中,但我没有找到这样做的方法。

作为解决方法,我可以考虑在您的 .bashrc:

中添加几行
# move auth socket to known place so even restored screen can find it
if [ -n "$SSH_AUTH_SOCK" ]; then
  [ -f "~/.ssh/agent.socket" ] && rm -f "~/.ssh/agent.socket"
  ln "$SSH_AUTH_SOCK" "~/.ssh/agent.socket"
  SSH_AUTH_SOCK="~/.ssh/agent.socket"
fi
# you already have
if [ -z "$STY" ]; then screen -R; fi 

(没有测试。我希望没有语法错误,但我相信你明白我的意思并且你可以修复它——我的答案下面有编辑按钮)。

有趣的是,在尝试使 Jakuje 提供的解决方案起作用的过程中,我偶然发现了一个 git link which in turn had a Superuser post,它有一个可行的想法版本。这是简短版本:

if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ]; then
    ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

如果您需要更多详细信息或其他可能的方法,请务必查看该页面。那里有讨论说这在非常特殊的情况下可能不起作用。