Gestion Ctrl-C dans la session SSH

20

Lorsque je démarre une session SSH qui exécute une commande de longue durée, que se passe-t-il avec la gestion de Ctrl+ C(SIGINT)?

Je peux voir que la session SSH est fermée, mais je ne sais pas qui obtient le SIGINT en premier: est-ce ...

  1. la commande à distance longue durée? c'est-à-dire que (a) le gestionnaire de signal dans la commande à distance est appelé et arrête la commande à distance, (b) le shell qui l'a engendrée détecte que la commande s'est arrêtée, et s'arrête également (c) le sshd distant détecte le shell arrêté, il ferme donc la connexion

    ou

  2. le ssh local reçoit le signal et ferme la connexion.

Je pense que (1) se produit, mais je veux m'assurer.

Je ne suis pas sûr non plus de ce qui se passe avec la gestion shell des SIGINT dans ce cas. Par exemple, si je ...

ssh remote 'while true ; do sleep 1 ; date ; done'

et Ctrl+ C, puis la connexion à distance est interrompue. Existe-t-il un moyen d'exécuter la commande à distance sous un shell qui restera en vie après Ctrl+ C? Autrement dit, dans ce cas, arrêter la boucle et me permettre de continuer à travailler sur le shell distant?

ttsiodras
la source
3
Un ssh non interactif ( ssh remote command, par opposition à ssh remote) sera tué (du côté local) par le SIGINT généré en tapant ctrl-C. Le côté distant continuera probablement (en fonction du système d'exploitation) jusqu'à ce qu'il essaie de lire ou d'écrire sur le socket fermé. Si vous souhaitez que toutes vos frappes, y compris ctrl-C, soient transmises à la télécommande, utilisez ssh remote.
Mark Plotnick
@MarkPlotnick: OK Mark - si vous ajoutez votre réponse ci-dessous comme réponse, je l'accepterai ... Dans mes propres tests, j'ai vérifié que la télécommande ne reçoit aucun signal.
ttsiodras
en relation: unix.stackexchange.com/questions/40023/…
bernard paulus

Réponses:

23

sshpeut être invoqué de différentes manières, chacune résultant en un traitement légèrement différent des signaux initiés par les terminaux comme Ctrl-C.

  • ssh remotehostexécutera une session interactive sur remotehost. Côté client, sshessaiera de mettre le tty utilisé par stdin en mode "brut", et sshdsur l'hôte distant allouera un pseudo-tty et exécutera votre shell en tant que shell de connexion (par exemple -bash).

    La définition du mode brut signifie que les caractères qui enverraient normalement des signaux (tels que Ctrl-Cet Ctrl-\) sont simplement insérés dans le flux d'entrée. sshenverra ces caractères tels quels à l'hôte distant, où ils enverront probablement SIGINT ou SIGQUIT et, en général, tuera toute commande et vous renverra à un shell sur l'hôte distant. La connexion ssh restera active tant que le shell distant sera actif.

  • ssh -t remotehost command args ...exécutera une session interactive sur remotehost, tout comme ci-dessus, sauf sur le côté distant, your_shell -c "command args ..."sera exécuté. Comme ci-dessus, si vous tapez Ctrl-C, il sera envoyé à l'hôte distant, où la commande recevra probablement SIGINT et quittera immédiatement, puis le shell distant quittera. La télécommande sshdferme ensuite la connexion et sshsignaleConnection to remotehost closed.

  • ssh remotehost command args ...exécutera une session non interactive sur remotehost. Côté client, le tty nessh passera pas en mode brut (enfin, sauf pour lire un mot de passe ou une phrase secrète). Si vous tapez Ctrl-C, sshSIGINT sera envoyé et sera immédiatement résilié, sans même émettre de Connection to remotehost closedmessage.

    Les your_shell -c "command args ..."processus resteront probablement en cours d'exécution sur l'hôte distant . Soit ils sortiront d'eux-mêmes, soit un processus essaiera d'écrire des données sur le socket ssh maintenant fermé, ce qui provoquera l'envoi d'un signal SIGPIPE fatal (généralement).

Mark Plotnick
la source
1
Techniquement, la commande à distance n'écrit pas directement dans le socket. Sa sortie standard est une pipe. Et sshd à l'autre extrémité lit les données, les chiffre et les envoie sur le socket. Le résultat final est cependant le même. La commande obtiendra un sigpipe car ce canal a disparu lorsque le client se déconnecte.
Stéphane Chazelas
@ StéphaneChazelas Merci, je vais éditer la réponse pour la corriger.
Mark Plotnick