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

157

Existe-t-il un moyen de se connecter à une session SSH déconnectée? Nous avons des problèmes avec notre connexion réseau à un site distant sur lequel nous travaillons séparément; Cependant, dans l'intervalle, nous rencontrons un grand nombre de déconnexions dues à la perte de paquets lors de la connexion à des serveurs situés sur l'emplacement distant. Plusieurs fois, la session reste active pendant un certain temps, et parfois elle se trouve au milieu d'une action (édition de fichier, exécution d'un processus, etc.) à laquelle je dois revenir plutôt que de redémarrer si possible.

cheval pâle
la source
10
Je ne peux pas croire que personne n'ait mentionné mosh.mit.edu
jwbensley
@ javano: Je n'en ai jamais entendu parler. Ajoutez cela comme une réponse!
Kbyrd
@kbyrd ont fait;)
jwbensley
une question similaire a été posée dans unix.stackexchange.com/questions/105001/… avec quelques conseils sur la manière de contourner les déconnexions ...
anarcat

Réponses:

136

UPDATE: Pour une réponse réelle, voir la réponse de zero_r ci-dessous

Ce n'est pas une réponse, mais une solution de contournement. Utilisez l' écran .

Lorsque vous vous connectez pour la première fois, lancez screen. Vous obtenez un autre shell, exécutez des commandes dans ce domaine. Si vous êtes déconnecté, le processus d'écran garde le terminal en vie de sorte que votre shell et les processus qu'il exécute ne tombent pas. Lorsque vous vous reconnectez, exécutez 'screen -r' pour le reprendre.

Il y a encore beaucoup à faire pour configurer et utiliser l'écran, mais la procédure ci-dessus devrait permettre de résoudre votre problème.

kbyrd
la source
18
Ou utilisez tmux - un écran «plus froid», j’ai utilisé les deux et je préfère de loin tmux car vous pouvez très bien diviser le terme.
John Hunt
3
J'étais heureux de trouver que j'étais screendéjà installé sur mon Ubuntu 12.x, donc si vous n'êtes pas sûr d'essayer cette commande, il s'est reconnecté et a repris le processus de mise à niveau : sudo screen -D -r
bjm88 le
1
@ bjm88, sudone doit être utilisé que si la session d'écran d'origine a été lancée avec sudo. Sinon, il reviendra comme s'il n'y avait pas de session d'écran:There is no screen to be detached
Noam Manos le
+1 je réalise que ce n'est pas la réponse réelle; Cependant, screen -rétait exactement ce que je cherchais.
Eric Nelson
130

Essayez de définir ClientAliveInterval (60, par exemple) et TCPKeepAlive (oui ou non) sur les valeurs appropriées du fichier sshd.conf côté serveur.

Cela devrait maintenir votre session en vie même si la connexion est perdue pendant quelques minutes.

zero_r
la source
24
Jusqu'à présent, vous semblez être le seul à répondre à la question au lieu de suggérer l'écran comme solution de contournement.
kbyrd
2
Bon appel. Nous avons trouvé cette méthode particulièrement utile lors de la traversée de pare-feu cisco ASA / PIX, qui, par défaut, aiment arrêter les connexions TCP.
Mike Pountney
5
Peut-être que ce n’est pas le bon endroit pour demander, mais est-il possible pour l’affiche de changer de réponse? Nous devrions avoir la réponse «écran» (la mienne n'est pas la meilleure, j'aime bien celle de Mike Pountney, mais j'ai le représentant) avec cette information.
kbyrd
1
Cela fonctionnera-t-il lorsqu'il sera connecté via une connexion VPN Cisco et que la connexion VPN sera perdue et rétablie?
Brent
pour moi, l'écran fonctionne parfaitement, je peux me reconnecter à la tâche présélectionnée et compter au travail
intégratorIT
65

Comme mentionné ci-dessus, GNU Screen est la voie à suivre. Cela vous permettra d'avoir une "session d'écran" sur le boîtier distant dans lequel vous pourrez exécuter plusieurs commandes, via plusieurs "fenêtres d'écran". Cela se détachera simplement si votre connexion SSH parent meurt, en conservant tous les sous-processus en fonctionnement.

' man screen' est votre ami comme d'habitude, et le paquetage du système d'exploitation devrait être appelé ' screen' s'il n'est pas installé par défaut.

Les bases sont:

  • Démarrer une session d'écran (sur votre hôte distant):

    $ screen
    
  • Se déconnecter de votre session d'écran: CTRL-A,d

  • Reconnectez-vous à votre session écran après vous être reconnecté:

    $ screen -d -r
    
  • Ouvrez un autre écran « fenêtre »: CTRL-A,c

  • Faites défiler vous des fenêtres écran ouvert: CTRL-A,space

Il y a beaucoup de choses intéressantes que vous pouvez faire avec Screen. Je l'utilise depuis plus de 10 ans et je découvre toujours de nouvelles fonctionnalités. C'est mon utilitaire Unix préféré.

Mike Pountney
la source
1
Oui, c'est une réponse bien meilleure que la mienne.
kbyrd
Puis-je toujours me connecter à la session ssh déconnectée si je redémarre mon ordinateur sur lequel l’écran est en cours d’exécution?
BarathVutukuri
tmux est plus puissant
Pegasus
46

Je ne peux pas croire que personne n'a mentionné MOSH ;

Mosh est un protocole distinct qui peut être connecté au processus de connexion SSH. Il maintient votre session en vie après des jours de déconnexion, de modification de l'adresse IP, de latence élevée, etc. Il est expliqué sur la page d'accueil mieux que je ne peux l'expliquer, donc j'ai copié la description ci-dessous. Mes expériences et mes conseils sont que je l’utilise sur mon mobile Android, c’est une bouée de sauvetage pour les voyages en SSH. La même chose est vraie sur mon ordinateur portable lorsque je suis attaché à un téléphone portable dans le train, par exemple. Je recommande de compiler à partir des sources pour obtenir la dernière version. La version du dépôt pour moi dans Ubuntu contient quelques inconvénients qui sont corrigés dans la dernière version (au moment de la rédaction).

Mosh (shell mobile)

Application de terminal distant qui permet l'itinérance, prend en charge la connectivité intermittente et fournit une modification intelligente de l'écho local et de la ligne des touches de l'utilisateur.

Mosh remplace SSH. Il est plus robuste et réactif, en particulier via les liaisons Wi-Fi, cellulaires et longue distance.

Mosh est un logiciel gratuit, disponible pour GNU / Linux, FreeBSD, Solaris, Mac OS X et Android.

Caractéristiques du site:

  • Changer l'adresse IP. Restez connecté : Mosh se déplace automatiquement lorsque vous passez d'une connexion Internet à une autre. Utilisez le Wi-Fi dans le train, Ethernet dans un hôtel et LTE sur une plage: vous resterez connecté. La plupart des programmes réseau perdent leurs connexions après l'itinérance, y compris les applications SSH et Web, telles que Gmail. Mosh est différent.

  • Fait de beaux rêves : avec Mosh, vous pouvez mettre votre ordinateur portable en veille et le réactiver plus tard, en gardant votre connexion intacte. Si votre connexion Internet est interrompue, Mosh vous en avertit, mais la connexion reprend lorsque le service réseau est rétabli.

  • Éliminez le décalage réseau : SSH attend la réponse du serveur avant de vous montrer votre propre frappe. Cela peut faire pour une interface utilisateur moche. Mosh est différent: il donne une réponse instantanée à la frappe, à la suppression et à la modification de ligne. Il le fait de manière adaptative et fonctionne même dans les programmes plein écran tels que emacs et vim. Sur une mauvaise connexion, les prédictions en suspens sont soulignées afin que vous ne soyez pas induit en erreur.

  • Pas de code privilégié. Pas de démon : vous n'avez pas besoin d'être le superutilisateur pour installer ou exécuter Mosh. Le client et le serveur sont des exécutables exécutés par un utilisateur ordinaire et qui ne durent que pendant la vie de la connexion.

  • Même méthode de connexion : Mosh n'écoute pas les ports réseau et n'authentifie pas les utilisateurs. Le client mosh se connecte au serveur via SSH et les utilisateurs présentent les mêmes informations d'identification (p. Ex. Mot de passe, clé publique). Ensuite, Mosh exécute le serveur mosh à distance et s'y connecte via UDP.

  • Fonctionne à l'intérieur de votre terminal, mais mieux : Mosh est un programme en ligne de commande, comme ssh. Vous pouvez l’utiliser dans xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen ou tmux. Mais mosh a été conçu à partir de zéro et ne prend en charge qu'un seul jeu de caractères: UTF-8. Il corrige des bugs Unicode dans d'autres terminaux et dans SSH.

  • Control-C fonctionne à merveille : contrairement à SSH, le protocole basé sur UDP de mosh gère les pertes de paquets avec élégance et définit la cadence en fonction des conditions du réseau. Mosh ne remplit pas les tampons réseau, donc Control-C
    fonctionne toujours pour arrêter un processus emballé.

Jwbensley
la source
8
Mosh n'est pas un wrapper ssh - c'est un protocole différent, presque totalement indépendant de ssh (il utilise uniquement ssh pour la connexion).
Jch
+1 Très vrai, mon erreur.
Jwbensley
2
Qu'en est-il de la sécurité, homme au milieu? chiffrement ? échange de clés?
Nasir Iqbal
Mosh a l'air génial, même si malheureusement il ne supporte pas encore la redirection de port .
Boann
20

autossh surveille votre connexion et si elle tombe en panne, elle se reconnecte. C'est plus fiable que le Keepalives. Si vous vous connectez à une session d’écran, vous continuerez directement à partir de l’endroit où vous vous êtes déconnecté (voir la documentation rscreenfournie avec autossh).

Hayalci
la source
1
en dehors d'un Keep-Alive configurable, il ne vous permet pas de vous reconnecter à une session (ce que recherchait le PO). mais autossh peut être vraiment utile pour les applications nécessitant des tunnels ssh, le mappage de ports, etc.
ives
oui autossh + screen serait le bon choix. autossh a rscreenpour cela.
Hayalci
Autossh est meilleur que Mosh. J'ai utilisé les deux.
Sridhar Sarnobat
Voici un article de blog de Jesse Keating, sur l'utilisation de autossh avec screen .
sampablokuper
12

tmux

Celui-ci est un classique. Utilisez-le chaque fois que vous courez le risque 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 dans l'action.

Jacksonkr
la source
Merci beaucoup! Je cherchais comment faire cela avec tmux, car cela semble être ce que la plupart des gens considèrent comme la meilleure option.
CoolOppo
10

Je voudrais installer et démarrer l'écran pour résoudre votre problème. Screen vous permettra de vous reconnecter à une session d'écran précédente.

En dehors de cela, screen vous permet également de faire des choses intéressantes comme diviser votre écran, afficher la console, etc. Vous pouvez trouver plus d'informations ici et ici .

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

screen -ls

pour voir vos sessions et

screen -r ${session} 

pour vous reconnecter à un réseau déconnecté.

wzzrd
la source
4

Comme d'autres l'ont déjà souligné, l'écran est généralement la meilleure solution et ajoute de nombreuses autres fonctionnalités utiles.

Vous pouvez configurer votre profil sur la machine distante pour qu'il se lance automatiquement et / ou se reconnecte à l'écran lors de la connexion, ce qui vous évite d'oublier de démarrer l'écran une fois que vous en avez besoin, car vous subissez une interruption de connexion.

Voir http://tlug.dnho.net/?q=node/239 (ou recherchez dans Google de nombreux autres exemples, faites de manière légèrement différente).

David Spillett
la source
3

une alternative plus moderne à screen, hélas non disponible pour certains types de "virtualisation" (par exemple, dans cygwin, vous pouvez avoir "screen", mais pas "tmux" en raison de la façon dont il a été conçu), mais où vous avez la possibilité d'installer tmux , Je recommanderais fortement d’opter pour celui-ci au lieu de l’écran.

cépale
la source
3

Voici une autre solution non-écran.

Le bac à mastic vous permet de faire exactement cela, il a une option de reconnexion à la déconnexion qui n’est pas en mode normal ou en mastic

https://puttytray.goeswhere.com/

c'est un fork de mastic (complètement open source) avec d'autres options, allez dans les paramètres de connexion et il y a 2 options, une pour "tentative de reconnexion en cas d'échec de la connexion" et "tentative de reconnexion au démarrage".

munkiepus
la source
1
Ehh Vient-il avec un enregistreur de frappe et un utilitaire automatique d'exfiltration ppk, par hasard?
Deer Hunter
1
Je suppose que vous demandez si, d'une manière ou d'une autre, il vole vos détails, il est complètement open source, le code source est disponible sur github si vous souhaitez consulter son github.com/FauxFaux/PuTTYTray, il existe de nombreux contributeurs: )
munkiepus
Bravo
2

Alors que screen maintiendra votre session shell ouverte sur le serveur distant si votre session ssh est abandonnée, cela ne réglera en rien le problème des connexions ssh. Comme zero_r le suggère, essayez d'optimiser votre connexion ssh avec keep alives et de longs délais d'attente.

Je vous suggère de rechercher la cause des paquets perdus à l'origine des problèmes et de résoudre ce problème au lieu de le contourner.

David
la source
Merci pour la suggestion. Nous travaillons à la recherche du problème fondamental de la perte de paquets, il faut simplement un certain temps pour le résoudre (très délicat, celui-ci!). C'est vraiment une solution de contournement pour cette période difficile. On ne sait jamais quand quelque chose va causer une perte de connexion.
Palehorse
1
Cela générera beaucoup de bruit, mais vous pouvez essayer d’exécuter ssh à travers strace et voir ce qu’il fait / rapporte quand la connexion ssh tombe. Cela pourrait bien rapporter ce que vous savez déjà, mais qui sait ...
David, le
1

Parfois, j'ai aussi oublié de passer à l'écran et de perdre mon travail inachevé. Dans ce cas, bien que nous ne puissions pas nous rattacher à une session SSH interrompue, il est encore possible de réparer un programme en cours d'exécution sur un nouveau terminal et de reprendre ce que vous faisiez reptyr.

Après avoir accidentellement déconnecté une session SSH, la première chose à faire est de s’exécuter de screenpeur que la connexion ne soit à nouveau interrompue. Ensuite, dans la nouvelle session, exécutez ps aux | grep {The process to be resumed}pour obtenir le PID. Avec le PID, vous pouvez essayer reptyr {PID}ou reptyr -T {PID}(s'il y a des sous-processus) de continuer le travail.

mars_happy
la source