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

Deadly 提交于 2019-12-02 14:09:32

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.

dreeves

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\"");
}

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

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

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"

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"
}

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!