【问题标题】:Automatically (or more easily) reconnect to a screen session after network interruption网络中断后自动(或更容易)重新连接到屏幕会话
【发布时间】:2010-10-03 06:19:00
【问题描述】:

添加:我相信这个问题现在被这个问题所包含: Using GNU Screen completely transparently and automatically

另请参阅此相关问题:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

原问题:

如果有办法通过 ssh 连接到机器并立即重新连接到特定的屏幕会话,那就太好了。你可以这样做:

laptop> ssh server.com screen -ls

它会显示 server.com 上可用的屏幕列表,如下所示 [1]:

123.pts-1
456.pts-2

然后你可以尝试这样做:

laptop> ssh server.com screen -dr pts-2

但这失败了,说“必须连接到终端”。 您必须先 ssh 进入,然后在 server.com 上执行“screen -dr pts-2”,如果您的连接不稳定并且经常断开连接,这将是不好的。您希望能够在笔记本电脑上通过简单的“向上箭头输入”来恢复。 (或者也许让它更加自动化。)

我对这个问题有一个巧妙的解决方案,我将把它作为答案发布,并希望它被否决而被遗忘,以支持处理这个问题的正确方法。


脚注:

[1] 或者,如果您使用“screen -S foo”和“screen -S bar”之类的名称创建屏幕会话,那么您会得到一个更友好的列表,例如:

123.foo
456.bar

并且可以重新连接,例如“screen -dr foo”。


小屏教程,结合本题答案:

登录 server.com 并执行

screen -S foo 

然后再也不会退出该会话。 要从其他地方重新连接到它,请执行

ssh -t server.com screen -dr foo

列出要重新连接的可用屏幕:

screen -ls

或者,当然,

ssh server.com screen -ls

远程检查 server.com 的可用屏幕。

我现在使用以下别名 (tcsh),根据 Jason 在下面的回答,连接到命名屏幕(如果存在)或创建并连接:

alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'

【问题讨论】:

    标签: ssh scripting automation gnu-screen


    【解决方案1】:

    -t 选项是否符合您的要求?

    -t 强制伪 tty 分配。这可以用来执行仲裁 将基于屏幕的程序放在远程机器上,可以是 非常有用,例如实现菜单服务时。多个 -t 即使 ssh 没有本地 tty,选项也会强制分配 tty。

    所以:

    laptop> ssh -t server.com screen -dr pts-2
    

    这似乎适用于我的安装。

    【讨论】:

    • 天哪,我不敢相信有那么容易!我实际上在几年前就想出了下面的怪物。我要告诉自己它早于 -t 选项。 :) 非常感谢您给出真正的答案!
    【解决方案2】:

    使用-t ssh 选项在直接运行命令时分配终端。

    laptop> ssh -t server.com screen -dr pts-2
    

    【讨论】:

      【解决方案3】:

      我一直在做类似的事情,但还没有完成,你的解决方案已经解决了我的问题,所以这是我的建议:

      ssh -t server.com "screen -S foo -rd || screen -S foo"
      

      这只是尝试打开名为 foo 的现有屏幕,如果它不存在,则创建它。 我会把它放在我笔记本电脑的启动器中,这样当无线网络断开时,我就可以在我离开的地方打开。

      刚刚注意到默认的屏幕外壳有点弱,所以一个更好地设置你的家庭环境的改进是:

      ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
      

      【讨论】:

        【解决方案4】:

        现在被这个包含:Using GNU Screen completely transparently and automatically


        这是一个脚本ssc,它的工作方式与ssh 类似,但它采用第三个参数来指定要重新连接的屏幕或新屏幕的名称。 我相信这个脚本包含了原始问题中的所有内容。
        #!/usr/bin/env perl
        # Use 'ssc' (this script) instead of 'ssh' to log into a remote machine.
        # Without a 3rd argument it will list available screens.
        # Give it a 3rd argument to attach to an existing screen or specify a new
        #   screen.  Eg, ssc remote.com foo
        # The numbers in front of the screen tag can usually be ignored.
        # Screen is a little too clever though in that if there's an existing screen "bar"
        #   and you say "ssc remote.com b" it will reconnect you to "bar" instead of making
        #   a new screen "b".  It's like invisible and silent tab-completion.
        
        if(scalar(@ARGV)==0 || scalar(@ARGV) > 2) {
          print "USAGE: ssc remote.com [screen name]\n";
        } elsif (scalar(@ARGV) == 1) {
          $machine = shift;
          @screens = split("\n", `ssh $machine screen -ls`);
          for(@screens) {
            if(/^\s*(\d+)\.(\S+)\s+\(([^\)]*)\)/) {
              ($num, $tag, $status) = ($1, $2, $3);
              if($status =~ /attached/i) { $att{"$num.$tag"} = 1; }
              elsif($status =~ /detached/i) { $att{"$num.$tag"} = 0; }
              else { print "Couldn't parse this: $_\n"; }
            }
          }
          print "ATTACHED screens:\n";
          for(keys(%att)) { print "  $_\n" if $att{$_}; }
          print "DETACHED screens:\n";
          for(keys(%att)) { print "  $_\n" unless $att{$_}; }
        } else {
          $machine = shift;
          $tag = shift;
          system("ssh -t $machine \"screen -S $tag -dr || screen -S $tag\"");
        }
        

        【讨论】:

        【解决方案5】:

        我将它转换为在 OS X .bash_profile 上工作,并添加了一个:如果没有给出第二个参数,它将启动一个“默认”会话。

        function ssc() {
            if [[ -z $2 ]]; then
                screen="default"
            else
                screen=$2
            fi
            ssh -t $1 "screen -S $screen -dr || screen -S $screen"
        }
        

        【讨论】:

          【解决方案6】:

          如果您想始终连接到同一个会话,即使它处于活动状态、已分离或尚不存在:

          ssh -t user@server screen -xR screenName

          如果它已经在其他一些 pty 上处于活动状态,则创建一个新会话:

          ssh -t user@server screen -rR screenName

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-04
            • 2011-12-04
            • 2010-11-04
            • 1970-01-01
            • 2013-12-06
            • 1970-01-01
            • 2021-05-03
            • 2017-11-19
            相关资源
            最近更新 更多