İçinde
ssh host tail -f file
ssh
İstemci bağlanır sshd
üzerinde sunucuya host
TCP bağlantısı üzerinden. stdout bir boruya yönlendirilmiş olarak sshd
çalışır tail -f
. sshd
borunun diğer ucundan gelenleri okur ve ssh
müşteriye göndermek için onu sshd protokolünde içine alır . ile ( rshd
, tail
stdout'u direkt olarak yuva, ama olurdu sshd
şifreleme ekler ve tek bir TCP bağlantısında çok borulara başvurmak zorunda (bağlantı noktası / madde / X11 / tünel yönlendirme, standart hataya için gibi çeşitli akışları) multipleks edebilir).
CTRL-C tuşlarına bastığınızda, ssh
istemciye bir SIGINT gönderilir . Bu ssh
ölüme neden olur . Öldüğünde, TCP bağlantısı kapalıdır. Ve bu nedenle, üzerinde host
, sshd
ölür de. tail
Öldürülmedi, ama stdoutu artık diğer ucunda okuyucu bulunmayan bir boru. Böylece, bir dahaki sefere stdout'una bir şeyler yazdığında, bir SIGPIPE alacak ve ölecek.
İçinde:
ssh -t host 'tail -f file'
Bunun yerine bir boru ile olma arasında iletişim dışında aynı şey sshd
ve tail
bir sözde-terminali üzerinden gerçekleştirilir. tail
stdout bir köle sözde terminali (benzeri /dev/pts/12
) ve ana tarafa yazılan her ne tail
ise read
(muhtemelen tty çizgi disiplini tarafından değiştirilmiş) müşteriye sshd
kapsüllenmiş olarak gönderilir ssh
.
İstemci tarafında, ile -t
, ssh
koyar terminali içinde raw
mod. Özellikle, terminal kanonik modunu ve terminal sinyal işlemesini devre dışı bırakır.
Bu nedenle, tuşuna bastığınızda Ctrl+C, müşterinin terminal hattı disiplini yerine ssh
işe bir SIGINT gönderme , bu sadece ^C
bağlantı üzerine karakter gönderir sshd
ve sshd
bunu ^C
uzak terminalin ana tarafına yazar . Ve uzaktan terminalinin hat disiplin bir gönderir SIGINT
için tail
. tail
sonra ölür, sshd
bağlantıdan çıkar ve bağlantıyı kapatır ve ssh
sona erer (aksi halde hala liman iletimleriyle veya diğer işlerle meşgul değilse).
Ayrıca, ile -t
, eğer ssh
istemci kalıpları (örneğin girerseniz ~.
), bağlantı kapatılır ve sshd
ölür. Sonuç olarak, bir SIGHUP'a gönderilecek tail
.
Şimdi, kullanmanın -t
yan etkileri olduğuna dikkat edin . Örneğin, varsayılan terminal ayarlarında, \n
karakterler \r\n
uzak sisteme bağlı olarak dönüştürülür ve daha fazla şey olabilir; bu nedenle stty -opost
bu çıkış amaçlanmadıysa, uzak ana bilgisayarda bir (çıkış sonrası işlemeyi devre dışı bırakmak için) yayınlamak isteyebilirsiniz. bir terminal:
$ 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
/ Kullanmanın başka bir sakıncası, -tt
stdout ve stderr'nin istemcide ayırt edilmemesidir. Remote komutunun stdout ve stderr'si ssh
müşterinin stdout'una yazılacaktır :
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1