Trong
ssh host tail -f file
Máy ssh
khách kết nối với sshd
máy chủ host
qua kết nối TCP. sshd
chạy tail -f
với thiết bị xuất chuẩn của nó được chuyển hướng đến một đường ống. sshd
đọc những gì đến từ đầu kia của ống và gói nó trong giao thức sshd để gửi cho ssh
khách hàng. (với rshd
, tail
thiết bị xuất chuẩn sẽ là ổ cắm trực tiếp, nhưng sshd
thêm mã hóa và có thể ghép nhiều luồng (như chuyển hướng cổng / tác nhân / X11 / đường hầm, stderr) trên một kết nối TCP duy nhất do đó phải dùng đến đường ống).
Khi bạn nhấn CTRL-C, SIGINT được gửi đến ssh
máy khách. Điều đó gây ra ssh
cái chết. Khi chết, kết nối TCP được đóng lại. Và do đó, trên host
, sshd
chết là tốt. tail
không bị giết, nhưng thiết bị xuất chuẩn của nó bây giờ là một ống không có đầu đọc ở đầu kia. Vì vậy, lần tiếp theo nó viết một cái gì đó vào thiết bị xuất chuẩn của mình, nó sẽ nhận được SIGPIPE và chết.
Trong:
ssh -t host 'tail -f file'
Đó là điều tương tự ngoại trừ thay vì ở với một đường ống, giao tiếp giữa sshd
và tail
thông qua một thiết bị đầu cuối giả. tail
Stdout là một thiết bị đầu cuối giả (như /dev/pts/12
) và bất cứ thứ gì được tail
viết ở read
phía chủ (có thể được sửa đổi bởi kỷ luật dòng tty) bằng cách sshd
gửi và đóng gói cho ssh
khách hàng.
Về phía khách hàng, với -t
, ssh
đặt thiết bị đầu cuối ở raw
chế độ. Cụ thể, điều đó vô hiệu hóa chế độ chính tắc đầu cuối và xử lý tín hiệu đầu cuối.
Vì vậy, khi bạn nhấn Ctrl+C, thay vì kỷ luật dòng thiết bị đầu cuối của khách hàng gửi SIGINT đến ssh
công việc, chỉ cần gửi ^C
ký tự qua kết nối đến sshd
và sshd
ghi nó ^C
vào phía chính của thiết bị đầu cuối từ xa. Và kỷ luật dòng của thiết bị đầu cuối từ xa gửi SIGINT
đến tail
. tail
sau đó chết, sshd
thoát ra và đóng kết nối và ssh
chấm dứt (nếu nó vẫn không bận rộn với chuyển tiếp cổng hoặc khác).
Ngoài ra, với -t
, nếu ssh
máy khách chết (ví dụ nếu bạn nhập ~.
), kết nối sẽ bị đóng và sshd
chết. Do đó, một SIGHUP sẽ được gửi đến tail
.
Bây giờ, hãy cẩn thận rằng sử dụng -t
có tác dụng phụ. Chẳng hạn, với cài đặt thiết bị đầu cuối mặc định, các \n
ký tự được chuyển đổi thành \r\n
nhiều thứ có thể xảy ra tùy thuộc vào hệ thống từ xa, do đó bạn có thể muốn phát hành stty -opost
(để tắt xử lý hậu kỳ đầu ra) trên máy chủ từ xa nếu đầu ra đó không dành cho một thiết bị đầu cuối:
$ 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
Một nhược điểm khác của việc sử dụng -t
/ -tt
là stdout và stderr không được phân biệt trên máy khách. Cả thiết bị xuất chuẩn và thiết bị xuất chuẩn của lệnh từ xa sẽ được ghi vào ssh
thiết bị xuất chuẩn của máy khách:
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1