55 votes

Se reconnecter automatiquement (ou plus facilement) à une session d'écran après une interruption du réseau

AJOUTÉ : Cette question est maintenant, je crois, subsumée par celle-ci : Utilisation de GNU Screen de manière totalement transparente et automatique

Voir aussi cette question connexe :
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

Question originale :

Ce serait bien s'il y avait un moyen de se connecter en ssh à une machine et de se reconnecter immédiatement à une session d'écran spécifique. Vous pouvez le faire :

laptop> ssh server.com screen -ls

et il affichera une liste des écrans disponibles sur server.com comme ceci [1] :

123.pts-1
456.pts-2

Et puis vous pourriez essayer de faire ça :

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

mais ça échoue, disant "Doit être connecté à un terminal". Vous devez d'abord vous connecter et ensuite faire le "screen -dr pts-2" sur server.com, ce qui n'est pas bon si votre connexion est fragile et que vous êtes souvent déconnecté. Vous voulez être en mesure de reprendre avec un simple "up-arrow enter" sur l'ordinateur portable. (Ou peut-être le rendre encore plus automatique).

J'ai une solution farfelue à ce problème que je vais poster en tant que réponse en espérant qu'elle sera descendue jusqu'à l'oubli en faveur de la bonne façon de traiter ce problème.


Notes de bas de page :

[1] Ou, mieux encore, si vous avez créé les sessions d'écran avec des noms comme " screen -S foo " et " screen -S bar ", alors vous obtiendrez une liste plus conviviale comme :

123.foo
456.bar

et peut se reconnecter avec, par exemple, " screen -dr foo ".


Tutoriel sur les écrans miniatures, intégrant la réponse à cette question :

Connectez-vous à server.com et faites

screen -S foo 

et ne plus jamais se déconnecter de cette session. Pour s'y reconnecter depuis un autre endroit, faites

ssh -t server.com screen -dr foo

Pour répertorier les écrans disponibles vers lesquels se reconnecter :

screen -ls

ou, bien sûr,

ssh server.com screen -ls

pour vérifier à distance les écrans disponibles de server.com.

J'utilise maintenant l'alias suivant (tcsh), basé sur la réponse de Jason ci-dessous, pour me connecter à un écran nommé s'il existe ou pour créer et me connecter sinon :

alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'

59voto

Greg Hewgill Points 356191

Est-ce que le -t option faire ce que vous voulez ?

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

Donc :

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

Cela semble fonctionner dans mon installation.

3voto

dreeves Points 9130

Ceci est maintenant subsumé par ceci : Utilisation de GNU Screen de manière totalement transparente et automatique


Voici un script, ssc qui fonctionne exactement comme ssh mais prend un troisième argument pour spécifier l'écran auquel se reconnecter, ou le nom d'un nouvel écran. Je crois que ce script subsume tout ce qui est dans la question originale.

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

2voto

J'ai travaillé sur quelque chose de similaire mais je n'y suis pas arrivé. Vos solutions ont résolu mon problème, alors voici ma suggestion :

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

Ceci essaie juste d'ouvrir l'écran existant nommé foo et s'il n'existe pas, le crée. Je vais le mettre dans un lanceur sur mon ordinateur portable, ainsi quand le réseau sans fil s'éteint, je peux simplement ouvrir là où je me suis arrêté.

Je viens de remarquer que la coquille d'écran par défaut est un peu faible, donc une amélioration qui met en place votre environnement domestique un peu mieux est :

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

2voto

Douglas Leeder Points 29986

Utilisez le -t à ssh pour allouer un terminal tout en exécutant directement une commande.

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

1voto

Oguz Points 19

Si vous souhaitez vous connecter toujours à la même session, même si elle est active, détachée ou n'existe pas encore :

ssh -t user@server screen -xR screenName

La même chose mais crée une nouvelle session si elle est déjà active sur un autre pty :

ssh -t user@server screen -rR screenName

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X