web-dev-qa-db-fra.com

Comment puis-je me reconnecter à une session ssh après un tuyau cassé?

J'exécutais donc apt-get upgrade sur un serveur lorsque le routeur a décidé que cela faisait trop longtemps qu'il ne m'avait pas mis en colère: il a perdu toute connexion. La morale de l’histoire est d’utiliser screenbeaucoup lorsque vous êtes sur un routeur banal.

Quoi qu'il en soit, je me suis connecté de nouveau et trouvé dans htop que le processus était toujours en attente, attendant toujours que mon Y/n se mette à jour (je ne l'avais pas encore frappé, heureusement). Est-il possible de rattacher une session à une session interrompue? J'ai fini par le tuer car ce n'était pas au cœur de la gestion des paquets, mais ce serait bien de le savoir pour référence future.

26
user6658

La réponse à votre question est: vous ne pouvez pas . Je pense que le principal problème est que les procédures d'authentification ne seront pas synchronisées. Ça ne marche pas comme ça.

Comme vous l'avez vous-même remarqué, la solution consiste à utiliser screen lorsque cela est possible (soit dit en passant, tmux est une alternative à screen).

16
January

Pour exécuter des processus de longue durée, j'utilise screen, ou byob si vous souhaitez une interface plus conviviale.

Pour l'écran, vous pouvez utiliser:

screen [program] [args]

Ceci exécutera [programme] et ses [arguments] dans une session screen. Une fois le programme terminé, la session est automatiquement fermée. Si vous souhaitez conserver la session après l'exécution de votre programme, exécutez simplement screen sans aucun argument et une nouvelle invite apparaîtra dans la session. CTRL + A + D sépare le terminal de la session en cours.

Pour vous rattacher à une session précédente:

screen -r

Si une seule session est ouverte, il sera immédiatement réattaché. Si plusieurs sessions sont en cours, il vous sera demandé quelle session vous souhaitez associer. Si vous connaissez le nom de la session, vous pouvez simplement l'ajouter en tant qu'argument à cette ligne de commande.

Byob est une amélioration intéressante. Il est basé sur écran, mais fournit une barre en bas qui affiche toutes les sessions en cours sous forme d'onglets et fournit des raccourcis plus faciles pour les déplacer. Vous pouvez:

  • F2 commence une nouvelle session
  • F3 passe à l'onglet de session suivant à gauche
  • F4 passer à l'onglet de session suivant à droite
  • F8 donne un nom convivial à l'onglet de session en cours
  • F9 ouvre un menu d'options
  • CTRL + A + D détache toutes les sessions du terminal.

Word OF ADVICE: éviter de laisser une session ouverte avec l'utilisateur root. Si quelqu'un accède à votre terminal (localement ou à distance), il peut facilement se reconnecter à une session en cours et utiliser votre système en tant que root. Si nécessaire, il est préférable de démarrer une session en utilisant un utilisateur commun et les lignes de commande Sudo indivudual si nécessaire.

9
JulioHM

Bien que vous ne puissiez pas vous reconnecter à une session SSH interrompue, , vous pouvez réparer le processus exécuté dans SSH - fonctionnellement équivalent à ce que vous voulez.

Instructions

Dans votre cas, vous reprendrez le processus apt-get à contrôler à partir d'une nouvelle session SSH, d'une session screen ou d'un moyen similaire. Mon préféré pour ceci est la commande reptyr:

$ Sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

Ensuite, avec le pid que vous avez trouvé pour votre processus:

$ Sudo reptyr -T 10626

Ou si cela ne fonctionne pas, essayez:

$ reptyr 10626

Après cette étape, toutes vos entrées au clavier vont au programme que vous avez repris. Malheureusement, vous ne verrez pas l'ancienne sortie de la session SSH, telle que la sortie apt-get vous demandant une confirmation.

Des explications

Plusieurs autres outils fonctionnent fondamentalement de la même manière que reptyr (c’est-à-dire via ptrace debug pièce jointe). Voir les questions et réponses suivantes où elles sont discutées:

Dans les instructions ci-dessus, le reptyr 10626 utilise la pièce jointe debug ptrace tandis que la commande Sudo reptyr -T 10626 utilise le vol de TTY et est préférable ( details ).

Enfin, la raison pour laquelle vous ne pouvez pas prendre en charge une session SSH de cette façon est qu’un processus sshd n’est pas contrôlé par un terminal hôte, mais qu'il fournit la partie esclave d’un terminal. - un périphérique pts - alors que la partie principale qui le contrôle réside sur la machine client, ici avec une session SSH interrompue entre les deux. Lorsque vous forcez la prise en charge d'un tel processus sshd avec reptyr -s <pid>, votre entrée au clavier passe à ce processus, et non à son processus enfant actif. Donc, un "Ctrl + Z" va tout simplement tuer ce sshd.

6
tanius