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

5

这是一件非常难以通过谷歌搜到的事情。我使用笔记本电脑配置的工作环境,在一天结束时我会休眠或关闭它。显然这样做会中断在putty上的SSH会话。经过一番尝试,我发现了一个很好的方法,可以自动启动屏幕并在通过putty重新连接时恢复已断开的会话(即在我的.bashrc文件末尾添加if [ -z "$STY" ]; then screen -R; fi)。

这个方法运行得很好,但我仍然有一个问题。我在笔记本电脑上通过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.

如您所见,它不能保留转发。但是,如果我不重新连接到屏幕,或在重新连接后完全退出并重新打开屏幕,则一切正常。

我该如何解决这个问题?

2个回答

4
有趣的是,在尝试让Jakuje提供的解决方案起作用的过程中,我偶然发现了一个git 链接,它反过来又有一个Superuser 帖子,其中包含了这个想法的可行版本。以下是简短版:
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

如果您想了解更多细节或其他潜在方法,请务必查看该页面。那里有讨论,指出在非常特定的情况下可能无法使用此方法。

3
screen会保留你在第一个连接中的环境变量,而且socket会断开连接。新的ssh会话将为您创建新的socket,但该会话的环境变量$SSH_AUTH_SOCK会被screen的环境变量覆盖。

清理的方法是将此变量保存到已恢复的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 

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


那个解释非常合理。我会尝试使用您的建议并查看它是否奏效(当然,在此之后回到这里更新)。谢谢! - Eric Shields
你走在了正确的道路上!虽然之前的尝试没有成功,但是在修复的过程中我偶然发现了一个可行的版本——请看我的采纳答案。显然,我的原始谷歌搜索技巧不够好... - Eric Shields

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接