Tại sao sshd không sử dụng thiết bị đầu cuối giả khi đối số của máy khách ssh được theo sau bởi một chương trình tương tác?


11

Cách thông thường để kết nối với máy chủ SSH là ssh username@ip_address. Nhưng người dùng có thể chỉ muốn chạy một chương trình trên máy từ xa. Vì vậy, tên chương trình theo sau các đối số bình thường đó là ssh username@ip_address <program_name>. Ví dụ , ssh username@ip_address ls. Lập luận đó là tốt, ngoại trừ cho các chương trình tương tác (mà cũng chấp nhận đầu vào người sử dụng cũng như cung cấp đầu ra) ví dụ top. Đầu ra là

Biến môi trường TATE không được đặt.

có nghĩa là không có thiết bị đầu cuối (giả) được gắn giữa sshd và các chương trình hàng đầu. Giải pháp là thêm đối số -ttrong đó toàn bộ lệnh bây giờ trở thành ssh -t username@ip_address top.

Câu hỏi của tôi là tại sao sshd theo mặc định cũng không thể sử dụng thiết bị đầu cuối giả để giao tiếp với các chương trình không tương tác để không cần thêm -tđối số cho các chương trình tương tác?


3
Câu trả lời ngắn gọn là "bởi vì đó thường không phải là điều bạn muốn".
Celada

Tôi dự đoán câu hỏi của bạn sẽ được kiểm duyệt vì về cơ bản là cầu xin một ý kiến ​​/ đưa ra ý kiến. Nhưng hãy lật lại câu hỏi: tại sao ssh nên phân bổ tài nguyên tty khi nó không bắt buộc trong phần lớn các trường hợp? Câu hỏi THỰC SỰ là: tại sao không bắt buộc phân bổ tùy chọn cấu hình để bạn có thể đặt mặc định đó thành mặc định hoặc máy chủ lưu trữ cụ thể?
Otheus 13/03/2016

@Otheus Đây tùy chọn cấu hình. Bạn có thể đặt RequestTTY yes(hoặc force) trong cấu hình của mình.
Jakuje

Er thực sự. Có vẻ như đã được giới thiệu trong 6 nhưng lỗi cho đến ngay sau đó. Tôi chỉ sử dụng các bản phân phối rất cũ. :)
Otheus

6
Làm thế nào SSH có thể biết một cách đáng tin cậy rằng một chương trình đang tương tác? Thậm chí topcó thể chạy trong chế độ hàng loạt.
muru

Câu trả lời:


18

Đúng là, như những người khác đã nói, PTY có một chi phí nhất định - nhưng lý do lớn cho việc không sử dụng PTY khi chạy lệnh từ xa là bạn mất thông tin.

Thông thường, khi bạn chạy một lệnh từ xa thông qua ssh, các lệnh stdoutstderrluồng được gửi đến cục bộ stdoutstderrđiều đó có nghĩa là bạn có thể chuyển hướng / dẫn chúng một cách riêng biệt - ví dụ:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

Nhưng nếu bạn sử dụng PTY, tất cả đầu ra sẽ chuyển sang stdout, vì PTY không có luồng riêng cho đầu ra / lỗi:

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$

Đây là một điểm tốt tôi đã không nhận thức được.
Jakuje

1
@ThomasDickey: Hầu như ... câu hỏi không phải là "lý do lịch sử đằng sau sự lựa chọn mặc định này của nhà phát triển là gì", mà là "tại sao sshd không thể sử dụng thiết bị đầu cuối giả theo mặc định" (sự nhấn mạnh là của tôi, mà là từ ngữ ít nhiều trực tiếp từ câu hỏi). Vì vậy, sự khác biệt trong hành vi (sẽ phá vỡ một số thành ngữ kịch bản) có liên quan, độc lập với cách các nhà phát triển đưa ra lựa chọn đó :-)
psmears 13/03/2016

2
@ThomasDickey: Bạn thậm chí đã đọc câu hỏi chưa? Nó đề cập đến ý kiến ​​của các nhà phát triển ở đâu?
psmears 13/03/2016

1
+1 chỉ ra một lợi thế cụ thể của việc không sử dụng pty (ngoài hiệu suất). Bạn vẫn có thể lập luận rằng đó -tphải là mặc định và một tùy chọn cần thiết để tắt nó, vì vậy thực sự lợi thế về hiệu suất nhỏ là điều có ý nghĩa nhất đối với tôi trong trường hợp không quan trọng.
Peter Cordes

7

Trang hướng dẫn để sshmô tả điều này:

Khi danh tính của người dùng đã được máy chủ chấp nhận, máy chủ sẽ thực thi lệnh đã cho trong một phiên không tương tác hoặc, nếu không có lệnh nào được chỉ định, hãy đăng nhập vào máy và cung cấp cho người dùng một vỏ bình thường như một phiên tương tác . Tất cả các giao tiếp với lệnh hoặc shell từ xa sẽ được tự động mã hóa.

Đó là tính năng và có thể gây ra bởi lý do lịch sử của rshhành vi. Nó là khá hợp lý. Hầu hết các lệnh thực sự không tương tác và nó không phải là hoạt động miễn phí để phân bổ PTY (điều quan trọng hơn 20 năm trước).


Các vấn đề tài nguyên là hợp lý, nhưng nhận xét về rshnó là tối nghĩa vì chương trình đó không có tùy chọn tương ứng.
Thomas Dickey

@ThomasDickey Tôi không bao giờ sử dụng rsh, nhưng chắc chắn có một số ảnh hưởng, không phải trong các tùy chọn, mà là trong hành vi của rshrlogin(nếu có lệnh hay không). Bạn không thể chạy một lệnh tương tác (như rogue (6) hoặc vi (1)) bằng cách sử dụng rsh; sử dụng rlogin (1) thay thế. .
Jakuje

1

Làm thế nào sshđể giả sử nếu lệnh bạn đang gọi có tương tác hay không?

Cơn ác mộng này trở nên tồi tệ hơn khi bạn nhận ra mình có thể đăng nhập vào một máy chạy hệ điều hành không unix.

Không có giải pháp dễ dàng nào một trường hợp phải được mặc định.


Nó không biết. Nó không thể biết. Và do đó chúng tôi có trang hướng dẫn mô tả hành vi trong những tình huống này.
Jakuje
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.