【问题标题】:Reconnecting SSH Agent forwarding when resuming an interrupted screen session恢复中断的屏幕会话时重新连接 SSH 代理转发
【发布时间】:2016-04-04 20:30:02
【问题描述】:

所以事实证明这对谷歌来说是一件非常困难的事情。我有一个工作设置,我在一天结束时休眠或关闭的笔记本电脑上运行所有东西。这样做显然会切断我在 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.

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

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    有趣的是,在尝试使 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
    

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

    【讨论】:

      【解决方案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 
      

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

      【讨论】:

      • 解释为什么完全有道理。我会玩弄你的提议,看看它是否可行(当然,之后会回来更新)。谢谢!
      • 你走对了!它不太奏效,但在尝试修复它时,我偶然发现了一个工作版本 - 请参阅我接受的答案。显然我原来的 google-fu 不好...
      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2021-09-25
      • 1970-01-01
      相关资源
      最近更新 更多