Làm thế nào là chiều dài và chiều rộng thiết bị đầu cuối được chuyển tiếp qua SSH và telnet?


15

Khi tôi xem chiều dài và chiều rộng của trình giả lập thiết bị đầu cuối của mình stty sizethì nó dài 271 ký tự và cao 71 dòng. Khi tôi đăng nhập vào một máy chủ khác qua SSH và thực thi stty size, thì nó cũng dài 271 ký tự và cao 71 dòng. Tôi thậm chí có thể đăng nhập vào một số thiết bị và thiết bị đầu cuối Cisco IOS vẫn dài 271 ký tự và cao 71 dòng:

C1841#show terminal | i Len|Wid
Length: 71 lines, Width: 271 columns
C1841#

Bây giờ nếu tôi thay đổi kích thước cửa sổ trình giả lập thiết bị đầu cuối (thiết bị đầu cuối Gnome) trong máy cục bộ, cả stty sizetrong máy chủ từ xa và "thiết bị đầu cuối hiển thị" trong IOS sẽ hiển thị số dòng và số dòng khác nhau. Làm thế nào là chiều dài và chiều rộng thiết bị đầu cuối được chuyển tiếp qua SSH và telnet?

Câu trả lời:


20

Các giao thức telnet, được mô tả trong RFC 854 , bao gồm một cách để gửi lệnh in-band, bao gồm các nhân vật IAC , '\255', tiếp theo là một vài byte hơn. Các lệnh này có thể thực hiện những việc như gửi ngắt đến điều khiển từ xa, nhưng thông thường chúng được sử dụng để gửi tùy chọn .

Một cái nhìn chi tiết về một trao đổi gửi tùy chọn loại thiết bị đầu cuối có thể được tìm thấy trong Microsoft Q231866 .

Các kích thước cửa sổ tùy chọn được mô tả trong RFC 1073 . Đầu tiên khách hàng gửi sự sẵn sàng của mình để gửi một NAWStùy chọn. Nếu máy chủ trả lời DO NAWS, thì máy khách có thể gửi NAWSdữ liệu tùy chọn, bao gồm hai giá trị 16 bit.

Phiên ví dụ, trên thiết bị đầu cuối cột 47 hàng 47:

telnet> set options
Will show option processing.
telnet> open localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SENT WILL NAWS
RCVD DO NAWS
SENT IAC SB NAWS 0 80 (80) 0 47 (47)

Giao thức ssh được mô tả trong RFC 4254 . Nó bao gồm một dòng tin nhắn. Một thông báo như vậy là "pty-req", yêu cầu một thiết bị đầu cuối giả và các tham số của nó bao gồm chiều cao và chiều rộng của thiết bị đầu cuối.

byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "pty-req"
boolean   want_reply
string    TERM environment variable value (e.g., vt100)
uint32    terminal width, characters (e.g., 80)
uint32    terminal height, rows (e.g., 24)
uint32    terminal width, pixels (e.g., 640)
uint32    terminal height, pixels (e.g., 480)
string    encoded terminal modes

Các máy khách telnet và ssh sẽ bắt được SIGWINCHtín hiệu, vì vậy nếu bạn thay đổi kích thước cửa sổ đầu cuối trong một phiên, chúng sẽ gửi một tin nhắn thích hợp đến máy chủ với kích thước mới. Ssh gửi thông báo thay đổi kích thước cửa sổ:

byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "window-change"
boolean   FALSE
uint32    terminal width, columns
uint32    terminal height, rows
uint32    terminal width, pixels
uint32    terminal height, pixels

Bạn có thể cập nhật với một ví dụ về các giá trị hex bạn có thể sử dụng để thực sự gửi Window Dimension Change Messagekhông? Tôi không thể tìm thấy một ví dụ về nó ở bất cứ đâu.
MirroredFate

@MirroredFate Mã C gửi tin nhắn đó là github.com/openssh/openssh-portable/blob/master/ ,. Tôi không biết cách để xem các byte thô được gửi; bạn có thể phải thêm một số đăng nhập vào mã nguồn openssh.
Đánh dấu Plotnick

2

Tôi nghi ngờ rằng nó thông qua tín hiệu SIGWINCH--- có thể được chuyển xuống đường ống.

Từ wikipedia :

SIGWINCH
    The SIGWINCH signal is sent to a process when its controlling
     terminal changes its size (a window change).

Nếu tôi làm một (trong zsh):

[romano:~] 1 % TRAPWINCH() {echo hi;}

... và tôi sửa đổi kích thước thiết bị đầu cuối:

[romano:~] % stty size
35 99
[romano:~] % hi
[romano:~] % hi
[romano:~] % hi
[romano:~] % stty size
31 80

0

RFC 4254 Mục 6.9 Tên thông báo "thay đổi cửa sổ" được gửi với kích thước mới. Về phía khách hàng, có thể đúng là SIGWINCH ban đầu bị bắt, nhưng tôi tin rằng nó được gửi qua tin nhắn đó. https://www.ietf.org/rfc/rfc4254.txt

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.