Di
ssh host tail -f file
The ssh
klien terhubung ke sshd
server pada host
melalui koneksi TCP. sshd
berjalan tail -f
dengan stdout diarahkan ke pipa. sshd
membaca apa yang datang dari ujung lain pipa dan merangkumnya dalam protokol sshd untuk dikirim ke ssh
klien. (dengan rshd
, tail
stdout akan menjadi soket secara langsung, tetapi sshd
menambahkan enkripsi dan mampu melipatgandakan beberapa aliran (seperti untuk pengalihan port / agen / X11 / terowongan, stderr) pada koneksi TCP tunggal sehingga harus menggunakan pipa).
Ketika Anda menekan CTRL-C, SIGINT dikirim ke ssh
klien. Itu menyebabkan ssh
mati. Setelah sekarat, koneksi TCP ditutup. Dan karena itu, pada host
, sshd
mati juga. tail
tidak terbunuh, tetapi stdout sekarang menjadi pipa tanpa pembaca di ujung lainnya. Jadi, saat berikutnya ia menulis sesuatu pada stdout-nya, ia akan menerima SIGPIPE dan mati.
Di:
ssh -t host 'tail -f file'
Itu adalah hal yang sama kecuali bahwa alih-alih menggunakan pipa, komunikasi antara sshd
dan tail
melalui terminal semu. tail
stdout adalah slave pseudo-terminal (seperti /dev/pts/12
) dan tail
tulisan apa pun yang ada read
di sisi master (mungkin dimodifikasi oleh disiplin garis tty) oleh sshd
dan dikirim dienkapsulasi ke ssh
klien.
Di sisi klien, dengan -t
, ssh
menempatkan terminal dalam raw
mode. Khususnya, yang menonaktifkan mode kanonik terminal dan penanganan sinyal terminal.
Jadi, ketika Anda menekan Ctrl+C, alih-alih disiplin jalur terminal klien mengirimkan SIGINT ke ssh
pekerjaan, yang hanya mengirim ^C
karakter melalui koneksi ke sshd
dan sshd
menulis itu ^C
ke sisi master terminal jarak jauh. Dan garis disiplin terminal jarak jauh mengirim SIGINT
ke tail
. tail
kemudian mati, dan sshd
keluar dan menutup koneksi dan ssh
berakhir (jika tidak masih sibuk dengan penerusan port atau lainnya).
Juga, dengan -t
, jika ssh
klien mati (misalnya jika Anda masuk ~.
), koneksi ditutup dan sshd
mati. Akibatnya, SIGHUP akan dikirim ke tail
.
Berhati-hatilah karena penggunaan -t
memiliki efek samping. Misalnya, dengan pengaturan terminal default, \n
karakter dikonversi ke \r\n
dan lebih banyak hal dapat terjadi tergantung pada sistem jarak jauh, sehingga Anda mungkin ingin mengeluarkan stty -opost
(untuk menonaktifkan pemrosesan pasca-output) pada host jarak jauh jika output itu tidak dimaksudkan untuk 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
Kelemahan lain dari menggunakan -t
/ -tt
adalah stdout dan stderr tidak dibedakan pada klien. Baik stdout dan stderr dari perintah remote akan ditulis ke ssh
stdout klien:
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1
-t
, jikassh
klien mati (misalnya jika Anda masuk~.
)" Apa~.
lagi?~.
adalah urutan keluar yang Anda masukkan untuk memutuskan koneksi klien. Lihatman ssh
detailnya.Anda memerlukan alokasi terminal di sisi jarak jauh:
atau bahkan
sumber
-t
atau-tt
berfungsi. Tetapi saya masih tidak dapat memahami alasan sebenarnya dari hal ini: katakanlah, ketika saya memanggil shell dari jarak jauh dan menutup koneksi, shell diakhiri. Tetapitail -f
tidak. Tentu saja saya sudah membaca tentang-t
opsiman ssh
, tetapi tidak banyak membantu. Sepertinya saya tidak mengerti beberapa obat generik, dan saya akan senang jika Anda menyarankan beberapa dokumen untuk membacanya, atau mungkin menjelaskannya sendiri. Terima kasih!sshd
kirim aSIGHUP
. Tetapi di mana tidak ada terminal, tidak ada hangup koneksi terminal ...SIGHUP
dan sinyal lainnya, masih tahu hampir tidak ada tentang itu.tail -f
, lalu saya sudah membukahtop
dan mengirimnyaSIGHUP
(dengan menekanF9
->1
->Enter
), dantail -f
diakhiri! Jadi, alasannya harus berbeda ..tail
tidak mau bereaksiSIGHUP
. Masalahnya adalahSIGHUP
** tidak dikirim` ketail
tanpa terminal palsu. Anda dapat melihat bahwa dengan melampirkanstrace
ketail
dalam kedua kasus.