Když zahájím relaci SSH, která provede dlouhotrvající příkaz, co se stane s Ctrl +C (SIGINT) zpracování?
Vidím, že relace SSH je uzavřena, ale nejsem si jistý, kdo dostane SIGINT jako první:je to…
-
vzdálený dlouhotrvající příkaz? to znamená, (a) je zavolán obslužný program signálu ve vzdáleném příkazu a zastaví vzdálený příkaz, (b) shell, který jej vytvořil, zjistí, že příkaz skončil, a také se zastaví (c) vzdálený sshd detekuje zastavení shellu, tak to uzavře spojení
nebo
-
místní ssh přijme signál a uzavře spojení.
Myslím, že (1) se děje, ale chci se ujistit.
Také si nejsem jistý, co se v tomto případě stane se zpracováním SIGINTů v shellu. Například, když …
ssh remote 'while true ; do sleep 1 ; date ; done'
a Ctrl +C , pak se vzdálené připojení přeruší. Existuje způsob, jak spustit vzdálený příkaz pod shellem, který zůstane naživu po Ctrl +C ? To znamená, že v tomto případě zastavit smyčku a umožnit mi pokračovat v práci na vzdáleném shellu?
Přijatá odpověď:
ssh
lze vyvolat několika různými způsoby, z nichž každý má za následek mírně odlišné zacházení se signály iniciovanými terminálem, jako je Ctrl-C .
-
ssh remotehost
spustí interaktivní relaci naremotehost
. Na straně klientassh
se pokusí nastavit tty používané stdin na „raw“ režim asshd
na vzdáleném hostiteli přidělí pseudo-tty a spustí váš shell jako přihlašovací shell (např.-bash
).Nastavení raw režimu znamená, že znaky, které by normálně vysílaly signály (jako Ctrl-C a Ctrl- ) jsou místo toho pouze vloženy do vstupního proudu.
ssh
odešle takové znaky tak, jak jsou, do vzdáleného hostitele, kde pravděpodobně pošlou SIGINT nebo SIGQUIT a obvykle ukončí jakýkoli příkaz a vrátí vás do shellu na vzdáleném hostiteli. Ssh připojení zůstane živé, dokud bude živý vzdálený shell. -
ssh -t remotehost command args ...
spustí interaktivní relaci naremotehost
, stejně jako výše, s výjimkou na vzdálené straně,your_shell -c "command args ..."
bude spuštěn. Stejně jako výše, pokud zadáte Ctrl-C , bude odesláno vzdálenému hostiteli, kde příkaz pravděpodobně obdrží SIGINT a okamžitě se ukončí, a poté se vzdálený shell ukončí. Vzdálenýsshd
poté uzavře připojení assh
hlásíConnection to remotehost closed.
-
ssh remotehost command args ...
spustí neinteraktivní relaci naremotehost
. Na straně klientassh
nebude nastavte tty na nezpracovaný režim (dobře, kromě čtení hesla nebo přístupové fráze). Pokud zadáte Ctrl-C ,ssh
bude odesláno SIGINT a bude okamžitě ukončeno, aniž by bylo nutné vydatConnection to remotehost closed
zprávu.your_shell -c "command args ..."
procesy pravděpodobně zůstanou spuštěné na vzdáleném hostiteli . Buď se samy ukončí, nebo se jeden proces pokusí zapsat data do nyní zavřeného soketu ssh, což způsobí, že do něj bude odeslán (obvykle) fatální signál SIGPIPE.