Ssh

如何通過 SSH 和 telnet 轉發終端長度和寬度?

  • July 14, 2017

當我查看終端仿真器的長度和寬度時,stty size它是 271 個字元長和 71 行高。當我通過 SSH 登錄到另一台伺服器並執行stty size時,它也是 271 個字元長和 71 行高。我什至可以登錄一些 Cisco IOS 設備,但終端仍然是 271 個字元長和 71 行高:

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

現在,如果我在本地機器上調整終端模擬器(Gnome 終端)視窗的大小stty size,遠端伺服器和 IOS 中的“顯示終端”都會顯示不同的行長和行數。如何通過 SSH 和 telnet 轉發終端長度和寬度?

RFC 854中描述的 telnet 協議包括一種發送帶內命令的方法,該命令由IAC 字元,'\255'和後面的幾個字節組成。這些命令可以執行諸如向遠端發送中斷之類的操作,但通常它們用於發送選項

可以在Microsoft Q231866中找到發送終端類型選項的交換的詳細資訊。

RFC 1073中描述了視窗大小選項。客戶端首先發送其發送選項的意願。如果伺服器回复,則客戶端可以發送選項數據,該數據由兩個 16 位值組成。NAWS``DO NAWS``NAWS

範例會話,在 47 行 80 列終端上:

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)

ssh 協議在RFC 4254中描述。它由消息流組成。一個這樣的消息是"pty-req",它請求一個偽終端,它的參數包括終端的高度和寬度。

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

telnet 和 ssh 客戶端將擷取SIGWINCH信號,因此如果您在會話期間調整終端視窗的大小,它們將使用新大小向伺服器發送適當的消息。SSH 發送 Window Dimension Change 消息:

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

引用自:https://unix.stackexchange.com/questions/207782