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 remotehost
exécutera une session interactive surremotehost
. Côté client,ssh
essaiera de définir le tty utilisé par stdin en mode "brut", etsshd
sur 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.
ssh
enverra 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écommandesshd
puis ferme la connexion, etssh
rapporteConnection to remotehost closed.
-
ssh remotehost command args ...
exécutera une session non interactive surremotehost
. Côté client,ssh
ne 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 ,ssh
recevra un SIGINT envoyé et sera immédiatement terminé, sans même émettre unConnection to remotehost closed
message.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.