Gestione Ctrl-C nella sessione SSH


20

Quando avvio una sessione SSH che esegue un comando di lunga durata, cosa succede con la gestione Ctrl+ C(SIGINT)?

Vedo che la sessione SSH è chiusa, ma non sono sicuro di chi ottenga SIGINT per primo: è ...

  1. il comando remoto di lunga durata? cioè, (a) il gestore del segnale nel comando remoto viene chiamato e arresta il comando remoto, (b) la shell che lo ha generato rileva che il comando si è fermato, e si ferma anche (c) lo sshd remoto rileva che la shell si è fermata, quindi chiude la connessione

    o

  2. lo ssh locale riceve il segnale e chiude la connessione.

Penso che (1) stia accadendo, ma voglio essere sicuro.

Sono anche incerto su ciò che accade con la gestione della shell di SIGINT in questo caso. Ad esempio, se io ...

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

e Ctrl+ C, quindi la connessione remota viene interrotta. C'è un modo per eseguire il comando remoto sotto una shell che rimarrà in vita dopo Ctrl+ C? Cioè, in questo caso, interrompere il loop e permettermi di continuare a lavorare sulla shell remota?


3
Un ssh non interattivo ( ssh remote command, al contrario di ssh remote) verrà ucciso (sul lato locale) dal SIGINT generato digitando ctrl-C. Il lato remoto probabilmente (dipende dal sistema operativo) rimarrà in esecuzione fino a quando non tenta di leggere o scrivere nel socket chiuso. Se si desidera che tutte le sequenze di tasti, incluso Ctrl-C, vengano trasmesse al telecomando, utilizzare ssh remote.
Mark Plotnick,

@MarkPlotnick: OK Mark: se aggiungi la tua risposta come risposta, la accetterò ... Nei miei test ho verificato che il telecomando non riceve alcun segnale.
ttsiodras,

Risposte:


23

sshpuò essere invocato in diversi modi, ciascuno risultante in un trattamento leggermente diverso di segnali iniziati dal terminale come Ctrl-C.

  • ssh remotehosteseguirà una sessione interattiva su remotehost. Sul lato client, sshproverà a impostare la tty utilizzata da stdin sulla modalità "raw", e sshdsull'host remoto assegnerà una pseudo-tty ed eseguirà la shell come shell di login (ad es.-bash .).

    L'impostazione della modalità raw significa che i caratteri che normalmente inviano segnali (come Ctrl-Ce Ctrl-\) vengono invece semplicemente inseriti nel flusso di input. sshinvierà tali caratteri così com'è all'host remoto, dove probabilmente invieranno SIGINT o SIGQUIT e, in genere, uccideranno qualsiasi comando e ti restituiranno a una shell sull'host remoto. La connessione SSH rimarrà in vita fino a quando la shell remota sarà attiva.

  • ssh -t remotehost command args ...verrà eseguita una sessione interattiva remotehost, proprio come sopra, tranne sul lato remoto, your_shell -c "command args ..."verrà eseguita. Come sopra, se si digita Ctrl-C, verrà inviato all'host remoto, dove probabilmente il comando riceverà SIGINT e uscirà immediatamente, quindi uscirà la shell remota. Il telecomando sshdquindi chiude la connessione e sshsegnalaConnection to remotehost closed.

  • ssh remotehost command args ...eseguirà una sessione non interattiva su remotehost. Sul lato client, sshsarà non impostare il tty per modalità raw (beh, tranne a leggere in una password o passphrase). Se si digita Ctrl-C, sshverrà inviato SIGINT e verrà immediatamente terminato, senza nemmeno emettere un Connection to remotehost closedmessaggio.

    I your_shell -c "command args ..."processi probabilmente rimarranno in esecuzione sull'host remoto . O usciranno da soli o un processo proverà a scrivere dati nel socket ssh ora chiuso, il che provocherà l'invio di un segnale SIGPIPE (in genere) fatale.


1
Tecnicamente, il comando remoto non scrive direttamente sul socket. Il suo stdout è una pipa. E sshd all'altro capo legge i dati, li crittografa e li invia sul socket. Il risultato finale è lo stesso però. Il comando otterrà un sigpipe perché quella pipe non c'è più quando il client si disconnette.
Stéphane Chazelas

@ StéphaneChazelas Grazie, modificherò la risposta per correggerla.
Mark Plotnick l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.