终端长度和宽度如何通过 SSH 和 telnet 转发?

Mar*_*tin 20 ssh terminal telnet stty

当我查看终端模拟器的长度和宽度时,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#
Run Code Online (Sandbox Code Playgroud)

现在,如果我在本地机器上调整终端模拟器(Gnome 终端)窗口的大小stty size,远程服务器和 IOS 中的“显示终端”都会显示不同的行长和行数。终端长度和宽度如何通过 SSH 和 telnet 转发?

Mar*_*ick 26

RFC 854 中描述的 telnet 协议包括一种发送带内命令的方法,该命令由IAC 字符,'\255'和多个字节组成。这些命令可以执行诸如向远程发送中断之类的操作,但通常它们用于发送选项

可以在Microsoft Q231866 中找到发送终端类型选项的交换的详细信息

所述窗口大小选项中所述RFC 1073。客户端首先发送其发送NAWS选项的意愿。如果服务器回复DO NAWS,则客户端可以发送NAWS由两个 16 位值组成的选项数据。

示例会话,在 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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)