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

时间:2015-12-30 20:26:48

标签: ssh ssh-keys gnu-screen ssh-agent

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

这非常有效,但我仍有问题。我使用SSH代理通过我的笔记本电脑上的Pageant(我最初输入密码)转发到辅助服务器。据我所知,当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

断开连接并重新连接

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 个答案:

答案 0 :(得分:3)

有趣的是,在试图通过Jakuje工作提供解决方案的过程中,我偶然发现了一个git link,而后者又有一个超级用户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

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

答案 1 :(得分:2)

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 

(没有测试它。我希望没有语法错误,但我相信你明白我的意思,你可以解决它 - 我的答案下有编辑按钮。)