Bagaimana panjang dan lebar terminal diteruskan melalui SSH dan telnet?

15

Ketika saya melihat panjang dan lebar emulator terminal saya dengan stty sizemaka panjangnya adalah 271 karakter dan tinggi 71 baris. Ketika saya masuk ke server lain melalui SSH dan mengeksekusi stty size, maka panjangnya juga 271 karakter dan tinggi 71 baris. Saya bahkan dapat masuk ke beberapa perangkat Cisco IOS dan terminalnya masih panjang 271 karakter dan tinggi 71 baris:

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

Sekarang jika saya mengubah ukuran jendela terminal emulator (terminal Gnome) saya di mesin lokal, baik stty sizedi server jauh dan "show terminal" di IOS menunjukkan panjang garis yang berbeda dan jumlah baris. Bagaimana panjang dan lebar terminal diteruskan melalui SSH dan telnet?

Martin
sumber

Jawaban:

20

Protokol telnet, yang dijelaskan dalam RFC 854 , termasuk cara untuk mengirim perintah dalam-band, yang terdiri dari karakter IAC , '\255', diikuti oleh beberapa byte lagi. Perintah-perintah ini dapat melakukan hal-hal seperti mengirim interupsi ke remote, tetapi biasanya mereka digunakan untuk mengirim opsi .

Pandangan terperinci pada pertukaran yang mengirim opsi jenis terminal dapat ditemukan di Microsoft Q231866 .

The ukuran jendela opsi yang dijelaskan dalam RFC 1073 . Klien pertama-tama mengirimkan kesediaannya untuk mengirim NAWSopsi. Jika server membalas DO NAWS, klien kemudian dapat mengirim NAWSdata opsi, yang terdiri dari dua nilai 16-bit.

Sesi contoh, pada terminal 47 baris 80 kolom:

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)

Protokol ssh dijelaskan dalam RFC 4254 . Ini terdiri dari aliran pesan. Salah satu pesan tersebut adalah "pty-req", yang meminta terminal palsu, dan parameternya termasuk tinggi dan lebar terminal.

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

Klien telnet dan ssh akan menangkap SIGWINCHsinyal, jadi jika Anda mengubah ukuran jendela terminal selama sesi, mereka akan mengirim pesan yang sesuai ke server dengan ukuran baru. Ssh mengirim Pesan Perubahan Dimensi Jendela:

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
Tandai Plotnick
sumber
Bisakah Anda memperbarui dengan contoh nilai hex yang dapat Anda gunakan untuk benar-benar mengirim Window Dimension Change Message? Saya tidak dapat menemukan contohnya di mana pun.
MirroredFate
@MirroredFate Kode C yang mengirim pesan itu adalah github.com/openssh/openssh-portable/blob/master/… . Saya tidak tahu bagaimana cara melihat byte mentah yang dikirim; Anda mungkin harus menambahkan beberapa logging ke kode sumber openssh.
Mark Plotnick
2

Saya curiga bahwa itu melalui sinyal SIGWINCH--- mungkin diturunkan pipa.

Dari wikipedia :

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

Jika saya melakukan zsh:

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

... dan saya mengubah ukuran terminal:

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

RFC 4254 Bagian 6.9 Nama pesan "perubahan jendela" dikirim dengan dimensi baru. Di sisi klien mungkin benar SIGWINCH asli tertangkap, tetapi itu dikirim melalui pesan yang saya percaya. https://www.ietf.org/rfc/rfc4254.txt

john
sumber