Pytanie w sprawie ssh, gnu-screen, automation, scripting – Używanie Ekranu GNU całkowicie przejrzysto i automatycznie

19

Screen jest oczywiście niesamowity, ale nie chcę o tym myśleć. Często ssh na maszynie, zaczynam robić różne rzeczy, a potem myślę: „Boże, chciałbym pomyśleć o rozpoczęciu sesji ekranowej przed zrobieniem tego wszystkiego, abym mógł się później połączyć z tym domem”.

Chciałbym, aby ekran był uruchamiany automatycznie po każdym zalogowaniu się do komputera. A kiedy się rozłączę, chcę być w stanie natychmiast i ponownie połączyć się bez kłopotów z „screen -ls” i „screen -dr”.

Mam skrypt, który implementuje jedno rozwiązanie tego problemu, które opublikuję jako odpowiedź. Jestem zainteresowany zobaczeniem innych podejść.

Twoja odpowiedź

8   odpowiedzi
7
ssh [email protected] -t 'screen -dRR'

łączeniu. Robi to dokładnie to, czego zażądano, nawet jeśli przenosi odpowiedzialność za pojawienie się sesji na klienta inicjującego. W idealnej sytuacji chciałbyś, aby jakiś proces na serwerze zarządzał tym, co zostanie przedstawione połączonym klientom. O ile wiem, nie istnieje. Nikt nie zaproponował idealnego rozwiązania w tym wątku. Dla mnie jest to mniej „nie idealne” niż reszta. Bez skryptów, bez błędów, bez problemów z TTY, bez złych interakcji z innymi poleceniami ssh, bez możliwości tworzenia nieskończonych pętli, bez edycji plików, bez dodatkowych pakietów.

10

autossh który automatycznie ponownie łączy rozłączone sesje ssh.

Pochodzi z przykładowego skryptu o nazwierscreen co dokładnie to robi. Po prostu:

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

Następnie musisz przekwalifikować palce do pisaniarscreen hostname zamiastssh hostname

1

exec screen -dr w Twoim .loginie?

7

cze łatwiejszy. Oto, czego używam:

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

Działa jak urok-x zapewnia, że ​​nawet jeśli ekran jest dołączony w innym miejscu, dołączam do niego tutaj. W ten sposób mam tylko jeden ekran, na którym mogę śledzić wszystko.

Co jeśli użytkownik uruchomi na przykład „nazwę hosta ssh„ ls -R ~ / .local ”? Sridhar Ratnakumar
1

mosh (mobilna powłoka). Utrzymuje połączenie, nawet jeśli przejdziesz do trybu uśpienia, rozłączysz się z siecią, zmienisz IP i tak dalej. Za każdym razem, gdy wrócisz, odzyskasz połączenie.

3

Mam następujące w moim .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

Znalazłem to gdzieś jakiś czas temu, nie wiem gdzie.

Aktualizacja Naprawiono błąd wskazywany w komentarzach. Dzięki R. Pate

@RogerPate nie, w rzeczywistości było lepiej przed pierwszym ustawieniem, a następnie eksportowaniem - w ten sposób był rzeczywiście przenośny i działał na innych powłokach zgodnych z POSIX. Teraz jest mniejszy o kilka bajtów, ale przerwie się, jeśli użyjesz np. Myślnika zamiast basha itp. Zobacz na przykładmywiki.wooledge.org/Bashism Matija Nalis
Czy „eksportowanie _STARTED_SCREEN = 1” nie jest wystarczające, a nie eksportowanie? Roger Pate
0

ale co z .bashrc? (Jeśli używasz bash „screen -rd”)

możesz sprawdzić, ale nie jest to łatwe do zrobienia poprawnie lub zwięźle. mówią naiwne metodyssh host 'echo hello world'. zobacz postępy w innych odpowiedziach. kevinlawler
powodem jest bomba widelca kevinlawler
Przyczyną downvote jest: ktoś nie lubi bash? EFraim
@highperformance: i co sprawia, że ​​myślisz, że nie możesz sprawdzić .bashrc, jeśli jesteś już uruchomiony na ekranie? Czy potrzebujesz także ostrzeżenia, że ​​kawa może być gorąca? EFraim
14

Użyj następujących,ssc, zamiastssh. Jeśli po prostu zrobiszssc remote.com„wtedy wyświetli listę istniejących sesji ekranu. Daj mu trzeci argument i połączy się z tą sesją na ekranie, albo stwórz ją i połącz się z nią. Tak czy inaczej, jeśli się rozłączysz, możesz po prostu zrobić„ strzałkę w górę ” wymagana powłoka do ponownego połączenia Niezbędna jest zerowa wiedza o ekranie Edytuj: Podziękowania dla @klochner za rozszerzenie tego w celu obsługi dowolnych opcji ssh. Możesz teraz użyć tego tak jak ssh!

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

Tak więc istnieje sztuczka polegająca na zmuszeniu sesji ssh do wyjścia i przywrócenie lokalnego monitu o terminal, gdy utracisz połączenie sieciowe:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

W moim systemie Ubuntu (10.4) musiałem zmodyfikować wyrażenie regularne, aby uwzględnić informacje o dacie i godzinie, które drukuje obok każdej sesji. if (/ ^ s * (d +) (S +) s + (([^)] *)) s + (([^)] *)) /) {($ num, $ tag, $ status) = (1 $, 2 $, 4 $); Nathan Bell
Jeśli ekran jest zbyt sprytny z niewidocznym i cichym uzupełnianiem kart na nazwach ekranów, proponuję konwencję upewnienia się, że każda nazwa ekranu, której używasz, zaczyna się od innej litery. Używaj słowa opisowego za pierwszym razem, ale od tego momentu możesz użyć tylko pierwszej litery. dreeves

Powiązane pytania