Wie werden Terminallänge und -breite über SSH und Telnet weitergeleitet?

15

Wenn ich die Länge und Breite meines Terminalemulators mit betrachte, stty sizedann ist er 271 Zeichen lang und 71 Zeilen hoch. Wenn ich mich über SSH bei einem anderen Server anmelde und ausführe stty size, sind es ebenfalls 271 Zeichen und 71 Zeilen. Ich kann mich sogar in ein Cisco IOS-Gerät einloggen und das Terminal ist immer noch 271 Zeichen lang und 71 Zeilen groß:

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

Wenn ich nun die Größe meines Terminal-Emulator-Fensters (Gnome-Terminal) auf dem lokalen Computer ändere, werden sowohl stty sizeauf dem Remote-Server als auch auf "Terminal anzeigen" in IOS unterschiedliche Zeilenlängen und Zeilenzahlen angezeigt. Wie werden Terminallänge und -breite über SSH und Telnet weitergeleitet?

Martin
quelle

Antworten:

20

Das in RFC 854 beschriebene Telnet-Protokoll enthält eine Methode zum Senden von In-Band-Befehlen, die aus dem IAC-Zeichen und '\255'mehreren weiteren Bytes bestehen. Diese Befehle können beispielsweise einen Interrupt an die Fernbedienung senden, werden jedoch normalerweise zum Senden von Optionen verwendet .

Einen detaillierten Überblick über eine Vermittlungsstelle, die die Option " Terminaltyp" sendet , finden Sie in Microsoft Q231866 .

Die Fenstergrößenoption wird in beschrieben RFC 1073 beschrieben . Der Kunde sendet zunächst seine Bereitschaft, eine NAWSOption zu senden . Wenn der Server antwortet DO NAWS, kann der Client die Optionsdaten senden NAWS, die aus zwei 16-Bit-Werten bestehen.

Beispielsitzung auf einem Terminal mit 47 Zeilen und 80 Spalten:

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)

Das SSH-Protokoll ist in RFC 4254 beschrieben . Es besteht aus einem Strom von Nachrichten. Eine solche Nachricht ist"pty-req" , die ein Pseudoterminal anfordert, und deren Parameter die Terminalhöhe und -breite umfassen.

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

Die Telnet- und SSH-Clients SIGWINCHempfangen das Signal. Wenn Sie also die Größe eines Terminalfensters während einer Sitzung ändern, senden sie eine entsprechende Nachricht mit der neuen Größe an den Server. Ssh sendet die Window Dimension Change Message:

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
quelle
Könnten Sie ein Beispiel für die Hex-Werte angeben, mit denen Sie die tatsächlich senden könnten Window Dimension Change Message? Ich kann nirgendwo ein Beispiel dafür finden.
MirroredFate
@MirroredFate Der C-Code, der diese Nachricht sendet, lautet github.com/openssh/openssh-portable/blob/master/… . Ich weiß nicht sofort, wie ich die gesendeten Rohbytes sehen soll. Möglicherweise müssen Sie dem openssh-Quellcode einige Protokollierungsschritte hinzufügen.
Mark Plotnick
2

Ich vermute, dass es über das Signal SIGWINCH--- wahrscheinlich die Pfeife runter geliefert wird.

Aus Wikipedia :

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

Wenn ich ein (in zsh) mache :

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

... und ich ändere die Terminalgröße:

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

RFC 4254 Abschnitt 6.9 Der Nachrichtenname "window-change" wird mit den neuen Dimensionen gesendet. Auf der Client-Seite mag es wahr sein, dass der ursprüngliche SIGWINCH abgefangen wurde, aber er wird meiner Meinung nach über diese Nachricht gesendet. https://www.ietf.org/rfc/rfc4254.txt

John
quelle