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


15

当我查看终端仿真器的长度和宽度时,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转发?

Answers:


20

Telnet协议,在所描述的RFC 854,包括一个方法来发送的带内的命令,由的IAC字符'\255',随后几个字节。这些命令可以完成向远程发送中断等操作,但通常用于发送options

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)

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发送窗口尺寸更改消息:

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

您可以使用实际发送十六进制值的示例进行更新Window Dimension Change Message吗?我在任何地方都找不到它的示例。
MirroredFate

@MirroredFate发送该消息的C代码是github.com/openssh/openssh-portable/blob/master/…。我不知道如何立即查看发送的原始字节。您可能必须在openssh源代码中添加一些日志记录。
Mark Plotnick

2

我怀疑这是通过信号发出的,SIGWINCH可能是通过管道传送的。

来自维基百科

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

如果我(在中zsh):

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

...然后修改终端大小:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.