Як передаються довжина та ширина клем через 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?

Відповіді:


20

Протокол Telnet, описаний в RFC 854 , включає в себе спосіб для відправки команд в смузі, що складається з характеру IAC , '\255'з подальшим ще кілька байт. Ці команди можуть виконувати такі дії, як надсилання перерви у віддалений, але зазвичай вони використовуються для надсилання опцій .

Детальний огляд обміну, що надсилає опцію типу терміналу, можна знайти в Microsoft Q231866 .

Параметр розміру вікна описаний в RFC 1073 . Клієнт спочатку надсилає бажання надіслати NAWSопцію. Якщо сервер відповідає DO NAWS, клієнт може потім надіслати NAWSпараметри даних, які складаються з двох 16-бітних значень.

Приклад сеансу на терміналі стовпця 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 Код С, який надсилає це повідомлення, є github.com/openssh/openssh-portable/blob/master/… . Я не знаю напевно, як бачити необроблені байти, що надсилаються; можливо, вам доведеться додати деякий журнал до вихідного коду opensh.
Марк Плотнік

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

0

RFC 4254 Розділ 6.9 Назва повідомлення "зміна вікна" надсилається з новими розмірами. З боку клієнта це може бути правдою, що оригінал SIGWINCH потрапив, але він надсилається через це повідомлення, я вважаю. https://www.ietf.org/rfc/rfc4254.txt

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.