GNU Screen vollständig transparent und automatisch verwenden

Der Bildschirm ist natürlich erstaunlich, aber ich möchte nicht darüber nachdenken müssen. Ich gehe oft auf eine Maschine, fange an, ein paar Sachen zu machen, und denke dann: "Meine Güte, ich wünschte, ich hätte eine Bildschirmsitzung gestartet, bevor ich das alles mache, damit ich später von zu Hause aus wieder eine Verbindung dazu herstellen kann."

Ich möchte, dass der Bildschirm automatisch gestartet wird, wenn ich mich bei einem Computer anmelde. Und wenn ich getrennt werde, möchte ich in der Lage sein, sofort und einfach wieder eine Verbindung herzustellen, ohne mich mit "screen -ls" und "screen -dr" herumzuschlagen.

Ich habe ein Skript, das eine Lösung für dieses Problem implementiert, die ich als Antwort posten werde. Ich bin interessiert, andere Ansätze zu sehen.

Antworten auf die Frage(8)

exec screen -dr in deinem .login?

Lösung für das Problem

Verwenden Sie die folgenden,ssc, anstattssh. Wenn du es einfach tust "ssc remote.com"Dann werden die vorhandenen Bildschirmsitzungen aufgelistet. Geben Sie ein drittes Argument ein und es wird eine Verbindung zu dieser Bildschirmsitzung hergestellt oder eine Verbindung hergestellt. In beiden Fällen können Sie einfach" Pfeil nach oben "eingeben, wenn die Verbindung getrennt wird Die Shell muss keine Bildschirmkenntnisse haben Edit: Dank an @klochner für die Erweiterung auf beliebige ssh-Optionen.

#!/usr/bin/env perl
# Use 'ssc' (this script) instead of 'ssh' to log into a remote machine.
# Without an argument after the hostname it will list available screens.
# Add an argument after the hostname 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.

# ssh option parsing by @klochner
my $optstring = ""; 
while ($val = shift) {
  if    ($val =~ /^-\w$/)  { $optstring .= " ".$val.(shift); }
  elsif ($val =~ /^-\w+$/) { $optstring .= " ".$val;         }
  elsif ($machine)         { $tag        =     $val;         }
  else                     { $machine    =     $val;         }
}

if (!$machine) {
  print "USAGE: ssc [ssh options] remote.com [screen name]\n";
} elsif (!$tag) {
  @screens = split("\n", `ssh $optstring $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"; }
      # remember anything weird about the screen, like shared screens
      if($status =~ /^(attached|detached)$/i) { 
        $special{"$num.$tag"} = "";
      } else {
        $special{"$num.$tag"} = "[$status]";
      }
    }
  }
  print "ATTACHED:\n";
  for(sort { ($a=~/\.(\w+)/)[0] cmp ($b=~/\.(\w+)/)[0] } keys(%att)) {
    ($tag) = /\.(\w+)/;
    print "  $tag\t($_)\t$special{$_}\n" if $att{$_};
  }
  print "DETACHED:\n";
  for(sort { ($a=~/\.(\w+)/)[0] cmp ($b=~/\.(\w+)/)[0] } keys(%att)) {
    ($tag) = /\.(\w+)/;
    print "  $tag\t($_)\t$special{$_}\n" unless $att{$_};
  }
} else {
 system("ssh $optstring -t $machine \"screen -S $tag -dr || screen -S $tag\"");
}

Übrigens gibt es einen Trick, eine SSH-Sitzung zum Beenden zu zwingen und Ihnen die Eingabeaufforderung Ihres lokalen Terminals zurückzugeben, wenn Sie die Netzwerkverbindung verlieren:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-wever-they-connect

 dreeves17. Juli 2009, 07:06
Ich empfehle eine Konvention, um sicherzustellen, dass jeder von Ihnen verwendete Bildschirmname mit einem bestimmten Buchstaben beginnt, damit der Bildschirm zu clever ist, da die Tabulatoren in den Bildschirmnamen unsichtbar und stumm erscheinen. Verwenden Sie beim ersten Mal ein beschreibendes Wort, von da an können Sie nur noch den ersten Buchstaben verwenden.
 Nathan Bell22. Nov. 2012, 09:11
Auf meinem Ubuntu-System (10.4) musste ich den regulären Ausdruck ändern, um die Datums- / Zeitangaben zu berücksichtigen, die neben jeder Sitzung ausgegeben werden. if (/ ^ \ s * (\ d +) \. (\ S +) \ s + (([^)] *)) \ s + ([^)] *)) {($ num, $ tag, $ status) = ($ 1, $ 2, $ 4);
ssh [email protected] -t 'screen -dRR'

llt. Dies tut genau das, was angefordert wurde, auch wenn die Verantwortung für das Spawnen der Sitzung auf den initiierenden Client übertragen wird. Idealerweise möchten Sie einen Prozess auf dem Server, der verwaltet, was den verbindenden Clients angezeigt wird. Soweit ich weiß, existiert das nicht. Niemand hat in diesem Thread die ideale Lösung vorgeschlagen. Für mich ist dies weniger "nicht ideal" als der Rest. Keine Skripte, keine Bugs, keine TTY-Probleme, keine schlechten Interaktionen mit anderen ssh-Befehlen, keine Möglichkeit für Endlosschleifen, keine Dateibearbeitung, keine zusätzlichen Pakete erforderlich.

Ich habe die folgenden in meinem .bashrc

 if [ "$PS1" != "" -a "${_STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" ] 
 then 
     export _STARTED_SCREEN=1;
     sleep 1 
     screen -RR && exit 0 
     # normally, execution of this rc script ends here... 
     echo "Screen failed! continuing with normal bash startup" 
 fi

Ich habe es vor einiger Zeit online gefunden und bin mir nicht sicher, wo.

Aktualisieren Fehler behoben, auf den in Kommentaren hingewiesen wurde. Vielen Dank, R. Pate

 Roger Pate02. Juli 2009, 20:49
Ist "export _STARTED_SCREEN = 1" nicht ausreichend, anstatt die Einstellung festzulegen und dann zu exportieren?
 Matija Nalis05. Aug. 2016, 13:16
@ RogerPate Nein, es war eigentlich besser, es zuerst festzulegen und dann zu exportieren. Auf diese Weise war es tatsächlich portabel und funktionierte auf anderen POSIX-kompatiblen Shells. Jetzt ist es einige Bytes kleiner, würde aber brechen, wenn Sie zum Beispiel Bindestrich anstelle von Bash usw. verwenden. Siehe zum Beispielmywiki.wooledge.org/Bashism

screen'. Das Skript ist also noch einfacher. Folgendes verwende ich:

if [ "$TERM" != "screen" ]; then
  screen -xRR
fi

Wirkt wie ein Zauber, der-x stellt sicher, dass auch wenn der bildschirm woanders angebracht ist ich ihn hier anhänge. Auf diese Weise habe ich nur einen Bildschirm, auf dem ich alles verfolgen kann.

 Sridhar Ratnakumar11. Aug. 2009, 04:58
Was passiert, wenn der Benutzer zum Beispiel "ssh hostname 'ls -R ~ / .local'" ausführt?

mosh (mobile Schale). Die Verbindung bleibt auch dann bestehen, wenn Sie in den Energiesparmodus wechseln, die Verbindung zum Netzwerk trennen, die IP-Adresse ändern usw. Immer wenn Sie zurückkehren, erhalten Sie Ihre Verbindung zurück.

autossh die automatisch getrennte ssh-sitzungen wieder verbindet.

Es wird mit einem Beispielskript namens geliefertrscreen was genau das tut. Es ist einfach:

#!/bin/sh
autossh -M 0 -t $1 "screen -e^Aa -D -R"

Dann müssen Sie Ihre Finger neu trainieren, um zu tippenrscreen hostname anstattssh hostname

aber was ist mit .bashrc? (Wenn Sie bash "screen -rd" verwenden)

 kevinlawler28. Dez. 2010, 18:09
Der Grund ist eine Gabelbombe
 kevinlawler06. Jan. 2011, 00:07
Sie können es überprüfen, aber es ist nicht einfach, es richtig oder prägnant zu machen. naive Methoden werden sagen brechenssh host 'echo hello world'. Den Fortschritt sehen Sie in den anderen Antworten.
 EFraim16. Aug. 2009, 19:17
Der Grund für die Ablehnung ist: Jemand mag Bash nicht?
 EFraim05. Jan. 2011, 20:44
@highperformance: und was lässt Sie denken, dass Sie .bashrc nicht einchecken können, wenn Sie bereits auf dem Bildschirm ausgeführt werden? Benötigen Sie auch eine Warnung, dass ein Kaffee heiß sein könnte?

Ihre Antwort auf die Frage