Nel
ssh host tail -f file
Il sshclient si connette al sshdserver su hostuna connessione TCP. sshdviene eseguito tail -fcon il suo stdout reindirizzato a una pipe. sshdlegge ciò che proviene dall'altra estremità della pipe e lo incapsula nel protocollo sshd da inviare al sshclient. (con rshd, tailstdout sarebbe stato il socket direttamente, ma sshdaggiunge la crittografia ed è in grado di multiplexare diversi flussi (come per il reindirizzamento port / agent / X11 / tunnel, stderr) su una singola connessione TCP, quindi deve ricorrere alle pipe).
Quando si preme CTRL-C, un SIGINT viene inviato al sshclient. Questo fa sshmorire. Alla morte la connessione TCP viene chiusa. E quindi, anche host, sshdmuore. tailnon viene ucciso, ma il suo stdout è ora una pipe senza lettore dall'altra parte. Quindi, la prossima volta che scrive qualcosa sul suo stdout, riceverà un SIGPIPE e morirà.
Nel:
ssh -t host 'tail -f file'
È la stessa cosa, tranne che invece di essere con una pipe, la comunicazione tra sshde tailavviene tramite uno pseudo-terminale. tailLo stdout è uno pseudo-terminale slave (come /dev/pts/12) e qualunque cosa tailscriva readsul lato master (possibilmente modificato dalla disciplina tty line) da sshde inviato incapsulato al sshclient.
Sul lato client, con -t, sshmette il terminale in rawmodalità. In particolare, ciò disabilita la modalità canonica terminale e la gestione del segnale terminale.
Quindi, quando si preme Ctrl+C, invece della disciplina della linea terminale del client che invia un SIGINT al sshlavoro, che invia semplicemente il ^Ccarattere sulla connessione sshde lo sshdscrive ^Csul lato principale del terminale remoto. E la disciplina di linea del terminale remoto invia un SIGINTa tail. tailquindi muore, sshdesce e chiude la connessione e sshtermina (se non è comunque occupato con il port forwarding o altro).
Inoltre, con -t, se il sshclient muore (ad esempio se si immette ~.), la connessione viene chiusa e sshdmuore. Di conseguenza, verrà inviato un SIGHUP tail.
Ora, attenzione che l'utilizzo -tha effetti collaterali. Ad esempio, con le impostazioni predefinite del terminale, i \ncaratteri vengono convertiti in \r\ne potrebbero accadere altre cose a seconda del sistema remoto, quindi potresti voler emettere un stty -opost(per disabilitare la post-elaborazione dell'output) sull'host remoto se quell'output non è destinato a un terminale:
$ ssh localhost 'echo x' | hd
00000000 78 0a |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000 78 0d 0a |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000 78 0a |x.|
00000002
Un altro svantaggio dell'uso di -t/ -ttè che stdout e stderr non sono differenziati sul client. Sia lo stdout che lo stderr del comando remoto verranno scritti nello sshstdout del client:
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1