В
ssh host tail -f file
sshКлієнт підключається до sshdсервера на hostза допомогою бездротової технології TCP. sshdпроходить tail -fзі своїм виступом, перенаправленим на трубу. sshdчитає, що надходить з іншого кінця труби, і інкапсулює його в протокол sshd для надсилання sshклієнту. (з rshd, tailstdout був би сокетом безпосередньо, але sshdдодає шифрування і може мультиплексувати декілька потоків (наприклад, для переходу на порт / агент / X11 / тунель, stderr) на одному TCP-з'єднанні, тому доводиться вдаватися до труб).
Коли ви натискаєте CTRL-C, sshклієнту надсилається SIGINT . Це змушує sshпомерти. Після відмирання TCP-з'єднання закривається. А отже, hostі sshdвмирає. tailне вбита, але тепер її виступ - це труба без читача на іншому кінці. Отже, наступного разу, коли він щось напише до свого stdout, він отримає ПІДПИС і помре.
В:
ssh -t host 'tail -f file'
Це те саме, за винятком того, що замість того, щоб бути з трубою, зв'язок між sshdі tailздійснюється через псевдотермінал. tail's stoutout' є псевдо-терміналом рабовласницького типу (як /dev/pts/12) і що б tailтам не readбуло написано на головній стороні (можливо, модифікованій дисципліною Tty line), sshdнадісланим інкапсульованим sshклієнтом.
На стороні клієнта, з -t, sshпереводить термінал в rawрежим. Зокрема, це вимикає канальний режим терміналу та обробку сигналу терміналу.
Отже, коли ви натискаєте Ctrl+Cзамість термінальної лінії клієнтської лінії, що надсилає SIGINT на sshзавдання, він просто надсилає ^Cперсонажа через з'єднання sshdі sshdзаписує ^Cйого на головну сторону віддаленого терміналу. І дисципліна лінії віддаленого терміналу посилає SIGINTна tail. tailпотім помирає, sshdвиходить і закриває з'єднання та sshприпиняється (якщо воно іншим чином ще не зайняте переадресацією портів чи іншим).
Також, -tякщо sshклієнт помирає (наприклад, якщо ви входите ~.), з'єднання закривається і sshdвідмирає. Як результат, SIGHUP буде надісланий на tail.
Тепер будьте уважні, що використання -tмає побічні ефекти. Наприклад, з налаштуваннями терміналу за замовчуванням \nсимволи перетворюються на \r\nінші речі, і це може траплятися більше, залежно від віддаленої системи, тому ви, можливо, захочете видати stty -opost(відключити післяобробну обробку виводу) на віддаленому хості, якщо цей вихід не призначений для термінал:
$ 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
Ще одним недоліком використання -t/ -ttє те, що stdout та stderr не відрізняються від клієнта. І stdout, і stderr віддаленої команди будуть записані в sshstdout клієнта:
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1