Ssh
如何通過 SSH 和 telnet 轉發終端長度和寬度?
當我查看終端仿真器的長度和寬度時,
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