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


15

ターミナルエミュレータの長さと幅を表示すると、長さstty size271文字、高さ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でどのように転送されますか?

回答:


20

記載のTelnetプロトコル、RFC 854は、から成る、インバンド・コマンドを送信する方法を含むIAC文字'\255'いくつかのより多くのバイトが続きます。これらのコマンドは、リモートに割り込みを送信するようなことを実行できますが、通常はオプションを送信するために使用されます

端末タイプオプションを送信する交換の詳細は、Microsoft Q231866に記載されています

ウィンドウサイズのオプションはで記述されているRFC 1073。クライアントは最初にNAWSオプションを送信する意思を送信します。サーバーが応答するDO NAWS場合、クライアントNAWSは2つの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で説明されています。メッセージのストリームで構成されています。そのようなメッセージの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

実際に送信するために使用できる16進値の例を更新できますWindow Dimension Change Messageか?その例はどこにもありません。
MirroredFate

@MirroredFateそのメッセージを送信するCコードはgithub.com/openssh/openssh-portable/blob/master/…です。送信された生のバイトをどのように見るのかわからない。opensshソースコードにログを追加する必要がある場合があります。
マークプロトニック

2

私はそれが信号を経由しているのではないかと疑っていますSIGWINCH---おそらくパイプを介して配信されます。

ウィキペディアから:

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

(in zsh)を実行した場合:

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

...そして、端末サイズを変更します:

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

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.