Come vengono inoltrate la lunghezza e la larghezza dei terminali su SSH e telnet?


15

Quando visualizzo la lunghezza e la larghezza del mio emulatore di terminale con stty sizeallora è lungo 271 caratteri e alto 71 linee. Quando accedo a un altro server tramite SSH ed eseguo stty size, allora ha anche 271 caratteri di lunghezza e 71 righe di altezza. Posso persino accedere ad alcuni dispositivi Cisco IOS e il terminale è lungo 271 caratteri e alto 71 linee:

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

Ora, se ridimensiono la finestra del mio emulatore di terminale (terminale Gnome) nella macchina locale, sia stty sizenel server remoto che in "mostra terminale" in IOS mostrano lunghezza e numero di linee diversi. Come vengono inoltrate la lunghezza e la larghezza dei terminali su SSH e telnet?

Risposte:


20

Il protocollo telnet, descritto in RFC 854 , include un modo per inviare comandi in banda, costituito dal carattere IAC , '\255', seguito da diversi più byte. Questi comandi possono eseguire operazioni come inviare un interrupt al telecomando, ma in genere vengono utilizzati per inviare opzioni .

Uno sguardo dettagliato a uno scambio che invia l' opzione del tipo di terminale è disponibile in Microsoft Q231866 .

L' opzione dimensione finestra è descritta in RFC 1073 . Il cliente invia innanzitutto la propria disponibilità a inviare NAWSun'opzione. Se il server risponde DO NAWS, il client può quindi inviare i NAWSdati dell'opzione, che comprende due valori a 16 bit.

Sessione di esempio, su un terminale a 47 righe 80 colonne:

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)

Il protocollo ssh è descritto in RFC 4254 . Consiste in un flusso di messaggi. Uno di questi messaggi è "pty-req", che richiede uno pseudo-terminale, e i suoi parametri includono l'altezza e la larghezza del terminale.

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

I client telnet e ssh cattureranno il SIGWINCHsegnale, quindi se ridimensionate una finestra del terminale durante una sessione, invieranno un messaggio appropriato al server con le nuove dimensioni. Ssh invia il messaggio di modifica della dimensione della finestra:

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

Potresti aggiornare con un esempio dei valori esadecimali che potresti utilizzare per inviare effettivamente il Window Dimension Change Message? Non riesco a trovarne un esempio da nessuna parte.
MirroredFate

@MirroredFate Il codice C che invia quel messaggio è github.com/openssh/openssh-portable/blob/master/… . Non so con disinvoltura come vedere i byte grezzi che vengono inviati; potresti dover aggiungere un po 'di log al codice sorgente di openssh.
Mark Plotnick,

2

Ho il sospetto che sia attraverso il segnale SIGWINCH--- probabilmente ha consegnato il tubo.

Da Wikipedia :

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

Se faccio un (in zsh):

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

... e modifico le dimensioni del terminale:

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

0

RFC 4254 Sezione 6.9 Il nome del messaggio "cambio finestra" viene inviato con le nuove dimensioni. Dal lato client può essere vero che l'originale SIGWINCH viene catturato, ma viene inviato tramite quel messaggio, credo. https://www.ietf.org/rfc/rfc4254.txt

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.