web-dev-qa-db-fra.com

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 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 en raison de la perte de paquets lors de la connexion aux serveurs à distance. Plusieurs fois, 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.) que je dois reprendre plutôt que de redémarrer si possible.

164
palehorse

MISE À JOUR: 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 écran .

Lorsque vous vous connectez pour la première fois, exécutez l'écran. Vous obtenez un autre Shell, exécutez des commandes là-dedans. Si vous êtes déconnecté, le processus d'écran maintient le terminal en vie afin que votre shell et les processus qu'il exécute ne tombent pas. Lorsque vous vous reconnectez, exécutez "screen -r" pour reprendre.

Il y a beaucoup plus à configurer et à utiliser l'écran, mais ce qui précède devrait contourner votre problème.

142
kbyrd

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

Cela devrait garder votre session active même si la connexion est perdue pendant quelques minutes.

134
zero_r

Comme mentionné ci-dessus, écran GN est le chemin à parcourir. Il vous permettra d'avoir une "session d'écran" sur la boîte à distance dans laquelle vous pourrez exécuter plusieurs commandes, via plusieurs "fenêtres d'écran". Cela se détachera simplement si votre connexion SSH parent meurt, gardant ainsi tous les sous-processus en cours d'exécution.

"man screen 'est votre ami comme d'habitude, et le package OS devrait s'appeler' screen 's'il n'est pas installé par défaut.

Les bases sont:

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

    $ screen
    
  • Déconnectez-vous de votre session écran: CTRL-Ad

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

    $ screen -d -r
    
  • Ouvrez une autre "fenêtre" d'écran: CTRL-Ac

  • Parcourez vos fenêtres d'écran ouvertes: CTRL-Aspace

Il y a beaucoup de trucs sympas 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é.

64
Mike Pountney

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

Mosh est un protocole séparé qui peut se connecter au processus de connexion SSH, il maintient votre session en vie après des jours de déconnexion, de changement d'adresse IP, de latence élevée, etc. Il est mieux expliqué sur la page d'accueil que je ne peux l'expliquer, j'ai donc copié la description ci-dessous. Mon expérience et mes conseils sont que je l'utilise sur mon Android mobile, c'est un épargnant de vie en voyage et en SSH. La même chose est vraie sur mon ordinateur portable lorsqu'il est attaché avec un mobile dans le train par exemple Je recommande de compiler à partir des sources pour obtenir la dernière version, la version repo pour moi dans Ubuntu a quelques ennuis qui sont corrigés dans la dernière version (au moment de la rédaction).

Mosh (coque mobile)

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

Mosh est un remplacement pour SSH. Il est plus robuste et réactif, en particulier sur les liaisons Wi-Fi, cellulaires et longue distance.

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

Fonctionnalités du site Web:

  • Modifiez l'IP. Restez connecté : Mosh se déplace automatiquement lorsque vous vous déplacez entre les connexions Internet. 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 comme Gmail. Mosh est différent.

  • Fait de beaux rêves : Avec Mosh, vous pouvez mettre votre ordinateur portable en veille et le réveiller plus tard, en gardant votre connexion intacte. Si votre connexion Internet tombe, Mosh vous avertira - mais la connexion reprendra lorsque le service réseau reviendra.

  • Débarrassez-vous du décalage réseau : SSH attend la réponse du serveur avant de vous montrer votre propre saisie. Cela peut faire une interface utilisateur moche. Mosh est différent: il donne une réponse instantanée à la saisie, à la suppression et à l'édition de ligne. Il le fait de manière adaptative et fonctionne même dans des programmes en plein écran comme emacs et vim. En cas de mauvaise connexion, les prédictions exceptionnelles sont soulignées afin que vous ne soyez pas induit en erreur.

  • Aucun 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 ne durent que pendant la durée de la connexion.

  • Même méthode de connexion : Mosh n'écoute pas sur 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 (par exemple, mot de passe, clé publique) qu'auparavant. Mosh exécute ensuite 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 les bogues Unicode dans d'autres terminaux et dans SSH.

  • Control-C fonctionne très bien : Contrairement à SSH, le protocole basé sur UDP de mosh gère gracieusement la perte de paquets et définit la fréquence d'images 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 d'emballement.

47
jwbensley

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

20
hayalci

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

14
Jacksonkr

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

En dehors de cela, l'écran 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é.

10
wzzrd

Comme d'autres l'ont souligné, l'écran est généralement la meilleure solution pour cela et il ajoute également un hôte d'autres fonctionnalités utiles.

Vous pouvez configurer votre profil sur la machine distante pour démarrer automatiquement et/ou vous reconnecter à l'écran lors de la connexion, ce qui vous évite d'oublier de démarrer l'écran la première fois que vous en avez besoin car vous souffrez d'une perte de connexion.

Voir http://tlug.dnho.net/?q=node/239 (ou rechercher dans Google de nombreux autres exemples de façons légèrement différentes).

4
David Spillett

Voici une autre solution sans écran.

Le bac PuTTY vous permet de faire exactement cela, il a une option de reconnexion sur déconnexion qui n'est pas en standard ou PuTTY-ng

https://puttytray.goeswhere.com/

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

3
munkiepus

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 sa conception), mais partout où vous avez la possibilité d'installer tmux , Je recommande fortement d'aller pour celui-là insted d'écran.

3
cepal

Bien que l'écran maintienne votre session Shell ouverte sur le serveur distant si votre session ssh tombe, il ne résoudra pas le problème des connexions ssh. Comme le suggère zero_r, essayez de régler 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 les résoudre au lieu de les contourner.

2
David

Parfois, j'ai oublié d'exécuter l'écran aussi et de perdre mon travail inachevé. Dans ce cas, bien que nous ne puissions pas nous reconnecter à une session SSH interrompue, reparenter un programme en cours d'exécution à un nouveau terminal et reprendre ce que vous faisiez est toujours possible grâce à reptyr.

Après une déconnexion accidentelle d'une session SSH, la première chose à faire est d'exécuter screen de peur 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 existe des sous-processus) pour continuer le travail.

2
march_happy