Como o comprimento e a largura do terminal são encaminhados por SSH e telnet?

13

Quando vejo o comprimento e a largura do meu emulador de terminal com stty size , ele tem 271 caracteres e 71 linhas de altura. Quando eu entro em outro servidor por SSH e executo stty size , então ele também tem 271 caracteres e 71 linhas de altura. Eu posso até fazer login em algum dispositivo Cisco IOS e o terminal ainda tem 271 caracteres e 71 linhas de altura:

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

Agora, se eu redimensionar a janela do meu emulador de terminal (terminal Gnome) na máquina local, tanto stty size no servidor remoto quanto "terminal de exibição" no IOS mostram comprimento de linha e número de linhas diferentes. Como o comprimento e a largura do terminal são encaminhados por SSH e telnet?

    
por Martin 05.06.2015 / 16:38

3 respostas

15

O protocolo telnet, descrito em RFC 854 , inclui uma maneira de enviar comandos em banda, consistindo do < em> caractere IAC , '5' , seguido por vários bytes adicionais. Esses comandos podem fazer coisas como enviar uma interrupção para o controle remoto, mas normalmente eles são usados para enviar opções .

Uma análise detalhada de uma troca que envia a opção tipo de terminal pode ser encontrada em Microsoft Q231866 .

A opção tamanho da janela é descrita em RFC 1073 . Primeiro, o cliente envia sua vontade de enviar uma opção NAWS . Se o servidor responder DO NAWS , o cliente poderá enviar os dados da opção NAWS , que é composta por dois valores de 16 bits.

Exemplo de sessão, em um terminal de coluna de 80 linhas 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)

O protocolo ssh é descrito em RFC 4254 . Consiste em um fluxo de mensagens. Uma dessas mensagens é "pty-req" , que solicita um pseudo-terminal, e seus parâmetros incluem a altura e a largura do 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

Os clientes telnet e ssh irão capturar o sinal SIGWINCH , então se você redimensionar uma janela de terminal durante uma sessão, eles enviarão uma mensagem apropriada para o servidor com o novo tamanho. Ssh envia a mensagem de mudança da dimensão da janela:

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
    
por 05.06.2015 / 18:04
2

Eu suspeito que seja através do sinal SIGWINCH --- provavelmente entregue pelo cano.

Em wikipedia :

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

Se eu fizer um (em zsh ):

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

... e modifico o tamanho do terminal:

[romano:~] % stty size
35 99
[romano:~] % hi
[romano:~] % hi
[romano:~] % hi
[romano:~] % stty size
31 80
    
por 05.06.2015 / 16:54
0

RFC 4254 Seção 6.9 O nome da mensagem "mudança de janela" é enviado com as novas dimensões. No lado do cliente, pode ser verdade que o SIGWINCH original foi detectado, mas é enviado por meio dessa mensagem, acredito. link

    
por 13.05.2016 / 18:51