214 votes

Comment se reconnecter à une session ssh déconnectée ?

Existe-t-il un moyen de se connecter à une session ssh qui a été déconnectée ? Nous rencontrons des problèmes avec notre connexion réseau à un site distant sur lequel nous travaillons séparément. Cependant, dans l'intervalle, nous constatons un grand nombre de déconnexions dues à des paquets perdus lorsque nous sommes connectés aux serveurs du site distant. Souvent, la session reste active pendant un certain temps, et parfois elle se trouve au milieu d'une action (édition de fichiers, exécution d'un processus, etc.) à laquelle je dois revenir plutôt que de la redémarrer si possible.

0 votes

Une question similaire a été posée dans unix.stackexchange.com/questions/105001/ avec quelques conseils sur la façon de contourner les déconnexions en premier lieu...

2 votes

Pour une réponse concrète, voir l'article de @march_happy. reptyr ou mon mode d'emploi ci-dessous.

22voto

Zachary Scott Points 146

autossh surveille votre connexion et si elle tombe en panne, il se reconnecte. C'est plus fiable que les keepalives. Si vous vous connectez à une session d'écran, vous continuerez à partir de l'endroit où vous vous êtes déconnecté (cf. rscreen qui est fourni avec autossh)

2 votes

En dehors d'un keep-alive configurable, il ne vous permet pas intrinsèquement de vous reconnecter à une session (ce que le PO recherchait). Mais autossh peut être vraiment utile pour les applications qui nécessitent des tunnels ssh, un mappage de port, etc.

0 votes

Oui autossh+écran serait le point idéal. autossh a rscreen pour ça.

0 votes

Autossh est meilleur que mosh. J'ai utilisé les deux.

21voto

Jacksonkr Points 445

Tmux

Celui-ci est un classique. Utilisez-le chaque fois que vous risquez de perdre la connexion à un terminal.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Juste comme ça, vous êtes de retour en action.

0 votes

Merci beaucoup ! Je cherchais comment faire cela avec tmux, puisque cela semble être la meilleure option pour la plupart des gens.

1 votes

Bien mieux que ça screen ¡!

11voto

Jeff Hillman Points 3333

J'installerais et lancerais l'écran pour résoudre votre problème. Screen vous permettra de vous reconnecter à une session d'écran précédente.

En outre, screen vous permet également de faire des choses sympas comme diviser votre écran, afficher la console, etc. Vous pouvez trouver plus d'informations aquí y aquí .

Pour commencer, si vous êtes déconnecté, vous pouvez utiliser

screen -ls

pour visualiser vos sessions et

screen -r ${session} 

pour se reconnecter à une personne déconnectée.

11voto

Utilice reptyr pour reparenter un programme en cours sur un nouveau terminal.

COMMENT FAIRE :

Supposons que nous nous soyons connectés à ssh à partir d'une adresse IP antérieure aaa.bbb.ccc.old ,
puis exécutez aptitude et au milieu du travail, cette connexion a été rompue.

Nous nous connectons avec ssh à nouveau (éventuellement à partir d'une adresse IP différente aaa.bbb.ccc.new ).
La connexion actuelle utilise pty/1 pseudo-terminal :

$ **tty**
/dev/**pts/1**

Mais il y a 2 connexions ouvertes, le courant pts/1 et le vieux brisé qui utilise pts/0 :

$ **who**
user     **pts/0**        2022-02-22 22:00 (**aaa.bbb.ccc.old**)
user     **pts/1**        2022-02-22 22:11 (**aaa.bbb.ccc.new**)

Lister tous les shells et leurs sous-processus :

$ **ps auf**
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user        **2000**  1.3  0.5  10168  5236 **pts/1**    Ss   22:11   0:00 **\-bash**
user        2001  0.0  0.3  10620  3304 pts/1    R+   22:11   0:00  \\\_ **ps auf**
user        **1000**  0.0  0.5  10168  5132 **pts/0**    Ss   22:00   0:00 **\-bash**
user        1001  5.8 16.0  46639 15839 pts/0    Sl+  22:00   0:03  \\\_ **aptitude**
root         820  0.0  0.1   5836  1840 tty1     Ss+  22:00   0:00 /sbin/agetty -o -p -- \\u --noclear tty1 linux
root         810  0.0  0.2   7360  2260 ttyS0    Ss+  22:00   0:00 /sbin/agetty -o -p -- \\u --keep-baud 115200,38400,9600 ttyS0 vt220

Il y a 2 bash coquilles :
l'actuel pts/1 un avec PID 2000 en cours d'exécution ps auf
et le vieux brisé pts/0 un avec PID 1000 en cours d'exécution aptitude

Reconnectons nous à l'ancien avec reptyr :

$ sudo **reptyr** -T **1000**

De cette façon, nous avons accès à l'ancien Shell et à ses sous-processus.
Puisque l'aptitude utilise ncurses vous devrez peut-être appuyer sur Ctrl + L ou redimensionner la fenêtre de l'émulateur de terminal pour l'obliger à se repeindre.
Maintenant nous pouvons arrêter aptitude et ensuite quitter l'ancien Shell ( 1000 ),
retournant ainsi à notre nouveau Shell ( 2000 ) avec seulement 1 connexion restante, qui est la connexion actuelle :

$ **who**
user     **pts/1**        2022-02-22 22:11 (**aaa.bbb.ccc.new**)

3voto

David Points 3489

Alors que screen maintiendra votre session Shell ouverte sur le serveur distant si votre session ssh est interrompue, il ne fera rien pour résoudre le problème des connexions ssh interrompues. Comme le suggère zero_r, essayez de régler votre connexion ssh avec des keep alives et des timeouts longs.

Je vous suggère de rechercher la cause des paquets perdus qui causent les problèmes et de la résoudre au lieu de la contourner.

0 votes

Merci pour cette suggestion. Nous nous efforçons de trouver l'origine du problème de la perte de paquets, mais cela prend du temps (c'est très délicat). Il s'agit vraiment d'une solution de contournement pour cette période problématique. On ne sait jamais quand quelque chose va provoquer une perte de connexion.

1 votes

Cela va générer beaucoup de bruit, mais vous pouvez essayer d'exécuter ssh avec strace et voir ce qu'il fait/rapporte lorsque la connexion ssh est interrompue. Il se peut qu'il ne rapporte que ce que vous savez déjà, mais qui sait...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X