web-dev-qa-db-ja.com

端末の長さと幅はSSHとTelnetでどのように転送されますか?

端末エミュレータの長さと幅をstty sizeで表示すると、長さが271文字、高さが71行です。 SSH経由で別のサーバーにログインしてstty sizeを実行すると、長さ271文字、高さ71行になります。一部のシスコにログインすることもできますIOSデバイスと端末は依然として長さが271文字、高さが71行です:

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

ローカルマシンでターミナルエミュレーター(Gnomeターミナル)ウィンドウのサイズを変更すると、リモートサーバーのstty sizeとIOSの "show terminal"の両方で、異なる行の長さと行数が表示されます。端末の長さと幅はSSHとTelnetでどのように転送されますか?

15
Martin

RFC 854 で説明されているtelnetプロトコルには、IAC文字で構成されるインバンドコマンドを送信する方法が含まれています。 '\255'、その後にさらに数バイトが続きます。これらのコマンドは、リモートへの割り込みの送信などを実行できますが、通常はoptionsの送信に使用されます。

端末タイプオプションを送信する取引所の詳細は、 Microsoft Q231866 にあります。

window sizeオプションについては RFC 107 で説明しています。クライアントはまず、NAWSオプションを送信する意思を送信します。サーバーが返信した場合DO NAWS、クライアントは2つの16ビット値で構成される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 で説明されています。メッセージのストリームで構成されます。そのようなメッセージの1つは"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
20
Mark Plotnick

信号SIGWINCH ---おそらくパイプ経由で配信されたのではないかと思います。

wikipedia から:

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
2
Rmano

RFC 4254セクション6.9メッセージ名「window-change」は、新しい次元で送信されます。クライアント側では、元のSIGWINCHがキャッチされるのは本当かもしれませんが、それは私が信じているそのメッセージを介して送信されます。 https://www.ietf.org/rfc/rfc4254.txt

0
john