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

28

Donc, je courais apt-get upgradesur un serveur lorsque le routeur a décidé que cela faisait trop longtemps que cela ne m'avait pas mis en colère: il a abandonné toute connexion. La morale de l'histoire est d'en utiliser screenbeaucoup lorsque vous êtes sur un toupie.

Quoi qu'il en soit, je me suis reconnecté et j'ai découvert dans htop que le processus était toujours suspendu, attendant toujours que mon Y / n soit mis à niveau (je ne l'avais pas encore frappé, heureusement). Existe-t-il un moyen de me rattacher à une session interrompue? J'ai fini par le tuer car ce n'était pas au milieu de la gestion des paquets, mais ce serait génial de le savoir pour référence future.

ζ--
la source
1
Je suis surpris que le apt-getprocessus soit toujours en cours. Il aurait dû mourir avec toute la chaîne de processus jusqu'à SSH. J'ai remarqué que cela do-dist-upgradedémarre automatiquement dans une session screen/ byobu: peut-être dans certaines circonstances, apt-getfait la même chose?
nfirvine

Réponses:

16

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

Comme vous l'avez vous-même remarqué, la solution consiste à utiliser l'écran lorsque cela est possible (au fait, tmux est une alternative à l'écran).

janvier
la source
1
Mais que faire si vous avez un ssh sans mot de passe? Pouvez-vous le faire alors?
Sridhar Sarnobat
1
byobuest une screentmux
interface
Sridhar-Samobol, l'authentification doit encore avoir lieu. Attacher à une session en cours n'a aucun moyen de refaire la prise de contact initiale, donc ses invariants seraient rompus si nous introduisions une nouvelle session dans une session existante. Réponse: non.
kevr
9

Pour exécuter des processus durables, j'utilise screen ou byobu si vous voulez une interface plus conviviale.

Pour l'écran, vous pouvez utiliser:

screen [program] [args]

Cela exécutera [programme] et ses [arguments] dans une session écran . Une fois le programme terminé, la session se ferme automatiquement. Si vous souhaitez conserver la session après l'exécution de votre programme, lancez simplement screen sans aucun argument et une nouvelle invite apparaîtra à l'intérieur de la session. CTRL + A + D détache le terminal de la session en cours.

Pour rattacher à une session précédente:

screen -r

S'il n'y a qu'une seule session ouverte, elle se reconnectera immédiatement. Si plusieurs sessions sont en cours, il vous demandera à laquelle vous souhaitez vous attacher. Si vous connaissez le nom de la session, vous pouvez simplement l'ajouter comme argument à cette ligne de commande.

Byobu est une belle amélioration. Il est basé sur l' écran , mais fournit une barre en bas qui montre toutes les sessions en cours sous forme d'onglets et donne des raccourcis plus faciles pour les déplacer. Vous pouvez:

  • F2 démarre une nouvelle session
  • F3 passer à l'onglet de session suivant sur la gauche
  • F4 passe à 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.

MOT DE CONSEIL : évitez de laisser une session ouverte avec la racine utilisateur . 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 des lignes de commande sudo indivudual si nécessaire.

JulioHM
la source
1
Puis-je citer l'OP: "La morale de l'histoire est d' utiliser beaucoup l' écran ". Apparemment, ce n'était pas la question ici.
Janvier
Merci pour la rédaction mais janvier était correct.
Utilisez sudo screen <command> pour configurer un écran en tant que root, qui a besoin d'un accès sudo pour s'y reconnecter. Bien mieux que de démarrer un écran normalement, puis de passer à la racine à l'intérieur.
djsmiley2k - CoW
8

Bien que vous ne puissiez pas vous rattacher à une session SSH interrompue, vous pouvez réparer le processus en cours d'exécution dans SSH - fonctionnellement équivalent à ce que vous voulez.

Instructions

Dans votre cas, vous reprenez le apt-getprocessus à contrôler depuis une nouvelle session SSH, une screensession ou similaire. Mon préféré pour cela est la reptyrcommande:

$ 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 apt-getsortie vous demandant une confirmation.

Explications

Il existe plusieurs autres outils qui fonctionnent essentiellement de la même manière reptyr(c'est-à-dire via une ptracepièce jointe de débogage). Voir les questions et réponses suivantes où elles sont discutées:

Dans les instructions ci-dessus, la pièce jointe reptyr 10626utilise le ptracedébogage tandis que la sudo reptyr -T 10626commande utilise le vol TTY et est préférable ( détails ).

Enfin, la raison pour laquelle vous ne pouvez pas prendre le contrôle d'une session SSH de cette façon est qu'un sshdprocessus n'est pas contrôlé par un terminal hôte, mais qu'il fournit la partie esclave d'un terminal - un ptspériphérique - tandis que la partie maître qui le contrôle réside sur le ordinateur client, ici avec une session SSH en panne entre les deux. Lorsque vous forcez la reprise d'un tel sshdprocessus avec reptyr -s <pid>, votre saisie au clavier va à ce processus, pas à son processus enfant actif. Donc, un "Ctrl + Z" va tout simplement tuer cela sshd.

tanius
la source
1

Je faisais do-dist-upgradevia ssh à partir d'un ordinateur portable qui est entré en suspension, par conséquent Broken pipe. En rentrant dans la machine, je voyais les processus liés à la mise à niveau toujours en cours d'exécution, parmi lesquels une whiptaildemande de saisie (quel gestionnaire d'affichage choisir) et, de manière pertinente, un root SCREEN. J'ai pu faire sudo su -et screen -rm'attacher à la session et, voilà, j'ai la boîte de dialogue whiptail devant moi en mesure de prendre des informations. J'ai pu reprendre la mise à niveau de manière transparente.

Remarque: il s'agissait d'une mise à niveau d'Ubuntu 14.04 vers 16.04.

haelix
la source