¿Cómo se reenvía la longitud y el ancho del terminal a través de SSH y Telnet?

15

Cuando veo la longitud y el ancho de mi emulador de terminal, stty sizeentonces tiene 271 caracteres de largo y 71 líneas de alto. Cuando inicio sesión en otro servidor a través de SSH y ejecuto stty size, también tiene 271 caracteres de largo y 71 líneas de alto. Incluso puedo iniciar sesión en algún dispositivo Cisco IOS y el terminal todavía tiene 271 caracteres de largo y 71 líneas de alto:

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

Ahora, si cambio el tamaño de la ventana de mi emulador de terminal (terminal Gnome) en la máquina local, tanto stty sizeen el servidor remoto como en "mostrar terminal" en IOS se muestra una longitud de línea y un número de líneas diferentes. ¿Cómo se reenvía la longitud y el ancho del terminal a través de SSH y Telnet?

Martín
fuente

Respuestas:

20

El protocolo Telnet, se describe en RFC 854 , incluye una forma de enviar comandos en-banda, que consiste en el carácter IAC , '\255', seguido por varios más bytes. Estos comandos pueden hacer cosas como enviar una interrupción al control remoto, pero generalmente se usan para enviar opciones .

Puede encontrar una vista detallada de un intercambio que envía la opción de tipo de terminal en Microsoft Q231866 .

La opción de tamaño de ventana se describe en RFC 1073 . El cliente primero envía su disposición a enviar una NAWSopción. Si el servidor responde DO NAWS, el cliente puede enviar los NAWSdatos de la opción, que se compone de dos valores de 16 bits.

Ejemplo de sesión, en un terminal de 47 filas y 80 columnas:

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)

El protocolo ssh se describe en RFC 4254 . Consiste en una secuencia de mensajes. Uno de estos mensajes es "pty-req", que solicita un pseudo-terminal, y sus parámetros incluyen la altura y el ancho del 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

Los clientes telnet y ssh captarán la SIGWINCHseñal, por lo que si cambia el tamaño de una ventana de terminal durante una sesión, enviarán un mensaje apropiado al servidor con el nuevo tamaño. Ssh envía el mensaje de cambio de dimensión de ventana:

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
fuente
¿Podría actualizar con un ejemplo de los valores hexadecimales que podría utilizar para enviar realmente el Window Dimension Change Message? No puedo encontrar un ejemplo de ello en ningún lado.
MirroredFate
@MirroredFate El código C que envía ese mensaje es github.com/openssh/openssh-portable/blob/master/… . No sé de antemano cómo ver los bytes sin procesar que se envían; Es posible que deba agregar algún registro al código fuente de openssh.
Mark Plotnick
2

Sospecho que es a través de la señal SIGWINCH--- probablemente entregado por la tubería.

De wikipedia :

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

Si hago un (in zsh):

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

... y modifico el tamaño del terminal:

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

RFC 4254 Sección 6.9 El nombre del mensaje "cambio de ventana" se envía con las nuevas dimensiones. En el lado del cliente, puede ser cierto que el SIGWINCH original se detecta, pero creo que se envía a través de ese mensaje. https://www.ietf.org/rfc/rfc4254.txt

John
fuente