Comment la longueur et la largeur du terminal sont-elles transmises via SSH et telnet?

15

Lorsque je regarde la longueur et la largeur de mon émulateur de terminal, stty sizeil fait 271 caractères de long et 71 lignes de haut. Lorsque je me connecte à un autre serveur via SSH et que j'exécute stty size, cela fait également 271 caractères de long et 71 lignes de haut. Je peux même me connecter à certains appareils Cisco IOS et le terminal a toujours 271 caractères de long et 71 lignes de haut:

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

Maintenant, si je redimensionne ma fenêtre d'émulateur de terminal (terminal Gnome) sur la machine locale, à la fois stty sizedans le serveur distant et "show terminal" dans IOS, la longueur et le nombre de lignes sont différents. Comment la longueur et la largeur du terminal sont-elles transmises via SSH et telnet?

Martin
la source

Réponses:

20

Le protocole Telnet, décrit dans le RFC 854 , comprend un moyen pour envoyer des commandes dans la bande, constitué par le caractère IAC , '\255', suivie de plusieurs autres octets. Ces commandes peuvent faire des choses comme envoyer une interruption à la télécommande, mais elles sont généralement utilisées pour envoyer des options .

Un examen détaillé d'un échange qui envoie l' option de type de terminal se trouve dans Microsoft Q231866 .

L' option de taille de fenêtre est décrite dans la RFC 1073 . Le client envoie d'abord sa volonté d'envoyer une NAWSoption. Si le serveur répond DO NAWS, le client peut alors envoyer les NAWSdonnées d'option, qui sont composées de deux valeurs 16 bits.

Exemple de session, sur un terminal à 47 colonnes et 80 colonnes:

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)

Le protocole ssh est décrit dans la RFC 4254 . Il consiste en un flux de messages. Un tel message est "pty-req", qui demande un pseudo-terminal, et ses paramètres incluent la hauteur et la largeur du 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

Les clients telnet et ssh capteront le SIGWINCHsignal, donc si vous redimensionnez une fenêtre de terminal pendant une session, ils enverront un message approprié au serveur avec la nouvelle taille. Ssh envoie le message de changement de dimension de fenêtre:

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
Mark Plotnick
la source
Pourriez-vous mettre à jour avec un exemple des valeurs hexadécimales que vous pourriez utiliser pour envoyer réellement le Window Dimension Change Message? Je n'en trouve aucun exemple nulle part.
MirroredFate
@MirroredFate Le code C qui envoie ce message est github.com/openssh/openssh-portable/blob/master/… . Je ne sais pas comment voir les octets bruts envoyés; vous devrez peut-être ajouter une journalisation au code source openssh.
Mark Plotnick
2

Je soupçonne que c'est via le signal SIGWINCH--- probablement envoyé dans le tuyau.

De wikipedia :

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

Si je fais un (en zsh):

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

... et je modifie la taille du terminal:

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

RFC 4254 Section 6.9 Le nom du message "changement de fenêtre" est envoyé avec les nouvelles dimensions. Côté client, il est peut-être vrai que le SIGWINCH d'origine est pris, mais il est envoyé via ce message, je crois. https://www.ietf.org/rfc/rfc4254.txt

John
la source