Automatically (or more easily) reconnect to a screen session after network interruption

后端 未结 6 1110
旧巷少年郎
旧巷少年郎 2021-01-30 00:20

ADDED: This question is now, I believe, subsumed by this one: Using GNU Screen completely transparently and automatically

See also this related question:
https://s

相关标签:
6条回答
  • 2021-01-30 00:36

    I've been working on something similar but not quite got there, your solutions have solved my problem so here's my suggestion:

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

    This just tries to open the existing screen named foo and if it doesnt exist, creates it. I'll put this in a launcher on my laptop, so when the wireless network goes I can just open where I left off.

    Just noticed that the default screen shell is a bit weak, so an improvement which sets up your home environment a little better is:

    ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
    
    0 讨论(0)
  • 2021-01-30 00:40

    I converted this to work on OS X .bash_profile with one addition: If no 2nd parameter is given, it will start a session "default".

    function ssc() {
        if [[ -z $2 ]]; then
            screen="default"
        else
            screen=$2
        fi
        ssh -t $1 "screen -S $screen -dr || screen -S $screen"
    }
    
    0 讨论(0)
  • 2021-01-30 00:45

    Does the -t option do what you want?

         -t      Force pseudo-tty allocation.  This can be used to execute arbi-
                 trary screen-based programs on a remote machine, which can be
                 very useful, e.g. when implementing menu services.  Multiple -t
                 options force tty allocation, even if ssh has no local tty.
    

    So:

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

    This seems to work in my installation.

    0 讨论(0)
  • 2021-01-30 00:48

    This is now subsumed by this: Using GNU Screen completely transparently and automatically


    Here's a script, ssc, that works just like ssh but takes a third argument to specify the screen to reconnect to, or the name of a new screen. I believe this script subsumes everything in the original question.

    #!/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\"");
    }
    
    0 讨论(0)
  • 2021-01-30 00:48

    Use the -t option to ssh to allocate a terminal while directly running a command.

    laptop> ssh -t server.com screen -dr pts-2
    
    0 讨论(0)
  • 2021-01-30 00:49

    If you like to connect to the same session always even it is active, detached or not exists yet:

    ssh -t user@server screen -xR screenName

    The same but create a new session if it is already active on some other pty:

    ssh -t user@server screen -rR screenName

    0 讨论(0)
提交回复
热议问题