Automatyczne (lub łatwiejsze) ponowne połączenie z sesją ekranu po przerwaniu sieci

Dodany: to pytanie jest teraz, jak sądzę, subsumowane przez to: Korzystanie z GNU Screen całkowicie przejrzyście i automatycznie

Zobacz też question:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

Pytanie pierwotne:

Byłoby miło, gdyby istniał sposób na ssh na komputerze i natychmiastowe ponowne połączenie z określoną sesją ekranu. Możesz zrobić to:

laptop> ssh server.com screen -ls

I pokaże listę ekranów dostępnych na server.com tak [1]:

123.pts-1
456.pts-2

I wtedy możesz spróbować to zrobić:

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

Ale to nie powiedzie się, mówiąc " musi być podłączony do terminala." Najpierw trzeba ssh a potem zrobić "screen-dr pts-2" na server.com co nie jest dobre, jeśli masz niestabilne połączenie i często się rozłączasz. Chcesz być w stanie wznowić za pomocą prostego "klawisza strzałki w górę" na laptopie. (A może jeszcze bardziej automatyczny.)

Mam rozwiązanie tego problemu, które zamieszczę jako odpowiedź i mam nadzieję, że zostanie pominięte na rzecz właściwego sposobu radzenia sobie z tym problemem.


Przypisy:

[1] lub, lepiej, jeśli utworzyłeś sesje ekranowe o nazwach takich jak " screen -S foo "i" screen -S bar", otrzymasz bardziej przyjazną listę, taką jak:

123.foo
456.bar

I może ponownie połączyć się z, np. "screen -dr foo".


Mini screen tutorial, zawierający odpowiedź na to pytanie:

Zaloguj się do server.com i do

screen -S foo 

I nigdy więcej nie Wyloguj się z tej sesji. Aby ponownie połączyć się z nim z innego miejsca, wykonaj

ssh -t server.com screen -dr foo

Aby wyświetlić listę dostępnych ekranów do ponownego rozpoznania:

screen -ls

Lub, oczywiście,

ssh server.com screen -ls

Aby sprawdzić na server.com dostępne ekrany zdalnie.

Teraz używam następującego aliasu (tcsh), na podstawie odpowiedzi Jasona poniżej, aby połączyć się z nazwanym ekranem, jeśli istnieje lub utworzyć i połączyć inaczej:

alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'
Author: Vadim Kotov, 2009-01-24

6 answers

Czy opcja -t robi to, co chcesz?

     -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.

Więc:

laptop> ssh -t server.com screen -dr pts-2
To chyba działa w mojej instalacji.
 56
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 23:08:59

To jest teraz subsumowane przez to: Używanie GNU Screen całkowicie przejrzyście i automatycznie


Oto skrypt ssc, który działa tak samo jak ssh, ale wymaga trzeciego argumentu, aby określić ekran do ponownego połączenia lub nazwę nowego ekranu. Wierzę, że ten scenariusz zastępuje wszystko w pierwotnym pytaniu.
#!/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\"");
}
 3
Author: dreeves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:49

Użyj opcji -t, aby SSH przydzielił terminal podczas bezpośredniego uruchamiania polecenia.

laptop> ssh -t server.com screen -dr pts-2
 2
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-23 23:10:00

Pracowałem nad czymś podobnym, ale nie do końca, Twoje rozwiązania rozwiązały mój problem, więc oto moja sugestia:

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

To po prostu próbuje otworzyć istniejący ekran o nazwie foo i jeśli nie istnieje, tworzy go. Umieszczę to w launcherze na moim laptopie, więc kiedy sieć bezprzewodowa zostanie uruchomiona, mogę otworzyć tam, gdzie skończyłem.

Właśnie zauważyłem, że domyślna powłoka ekranu jest nieco słaba, więc ulepszenie, które ustawia środowisko domowe trochę lepiej jest:

ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 16:29:21

Przekonwertowałem to do pracy na OS X .bash_profile z jednym dodatkiem: jeśli nie podano drugiego parametru, rozpocznie sesję "domyślną".

function ssc() {
    if [[ -z $2 ]]; then
        screen="default"
    else
        screen=$2
    fi
    ssh -t $1 "screen -S $screen -dr || screen -S $screen"
}
 1
Author: udondan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-06 06:34:40

Jeśli chcesz połączyć się z tą samą sesją zawsze nawet ona jest aktywna, odłączona lub jeszcze nie istnieje:

SSH-t user@server screen-XR screenName

To samo, ale Utwórz nową sesję, jeśli jest już aktywna na innym pty:

SSH-t user@server screen-RR screenName

 1
Author: Oguz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 13:50:22