Lorsque je démarre une session SSH qui exécute une commande de longue durée, que se passe-t-il avec Ctrl +C Gestion (SIGINT) ?
Je vois que la session SSH est fermée, mais je ne sais pas qui obtient le SIGINT en premier :est-ce…
-
la commande de longue durée à distance ? 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é détecte que la commande s'est arrêtée et s'arrête également (c) le sshd distant détecte que le shell s'est arrêté, il ferme donc la connexion
ou
-
le ssh local reçoit le signal et ferme la connexion.
Je pense que (1) est en train de se produire, mais je veux m'en assurer.
Je suis également incertain de ce qui se passe avec la gestion par le shell des SIGINT dans ce cas. Par exemple, si je …
ssh remote 'while true ; do sleep 1 ; date ; done'
et Ctrl +C , la connexion à distance est interrompue. Existe-t-il un moyen d'exécuter la commande à distance sous un shell qui restera actif après Ctrl +C ? C'est-à-dire, dans ce cas, arrêter la boucle et me permettre de continuer à travailler sur le shell distant ?
Réponse acceptée :
ssh peut être invoqué de différentes manières, chacune résultant d'un traitement légèrement différent des signaux initiés par le terminal comme Ctrl-C .
-
ssh remotehostexécutera une session interactive surremotehost. Côté client,sshessaiera de définir le tty utilisé par stdin en mode "brut", etsshdsur l'hôte distant allouera un pseudo-tty et exécutera votre shell en tant que shell de connexion (par exemple,-bash).Définir le mode brut signifie que les caractères qui enverraient normalement des signaux (tels que Ctrl-C et 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, généralement, tueront toute commande et vous renverront à un shell sur l'hôte distant. La connexion ssh restera active tant que le shell distant est actif. -
ssh -t remotehost command args ...exécutera une session interactive surremotehost, comme ci-dessus, sauf du 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 se terminera immédiatement, puis le shell distant se terminera. La télécommandesshdpuis ferme la connexion, etsshrapporteConnection to remotehost closed. -
ssh remotehost command args ...exécutera une session non interactive surremotehost. Côté client,sshne va pas réglez le tty en mode brut (enfin, sauf pour lire un mot de passe ou une phrase secrète). Si vous tapez Ctrl-C ,sshrecevra un SIGINT envoyé et sera immédiatement terminé, sans même émettre unConnection to remotehost closedmessage.Le
your_shell -c "command args ..."les processus continueront probablement de s'exécuter 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 entraînera l'envoi d'un signal SIGPIPE (généralement) fatal.