Terminal uzunluğu ve genişliği SSH ve telnet üzerinden nasıl iletilir?


15

Terminal öykünücümün uzunluğunu ve genişliğini görüntülediğimde stty size271 karakter uzunluğunda ve 71 satır yüksekliğinde. SSH üzerinden başka bir sunucuda oturum açıp çalıştırdığımda stty size271 karakter uzunluğunda ve 71 satır yüksekliğinde. Hatta bazı Cisco IOS cihazlarına giriş yapabilirim ve terminal hala 271 karakter uzunluğunda ve 71 satır yüksekliğinde:

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

Şimdi yerel makinedeki terminal emülatörüm (Gnome terminali) penceremi yeniden boyutlandırırsam, hem stty sizeuzak sunucuda hem de IOS'ta "terminali göster" farklı satır uzunluğu ve satır sayısını gösterir. Terminal uzunluğu ve genişliği SSH ve telnet üzerinden nasıl iletilir?

Yanıtlar:


20

Olarak açıklanan telnet protokolü, RFC 854 , oluşan bant komutları göndermek için bir yol içeren IAC karakteri , '\255'birkaç fazla bayt izledi. Bu komutlar uzaktan kumandaya kesinti gönderme gibi şeyler yapabilir, ancak genellikle seçenekleri göndermek için kullanılır .

Terminal türü seçeneğini gönderen bir exchange'e ayrıntılı bir bakış Microsoft Q231866'da bulunabilir .

Pencere boyutu seçeneği açıklanan RFC 1073 . Müşteri önce bir NAWSseçenek gönderme isteğini gönderir . Sunucu yanıt verirse, DO NAWSistemci daha sonra NAWSiki 16 bitlik değerden oluşan seçenek verilerini gönderebilir .

47 satır 80 sütunlu terminalde örnek oturum:

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)

Ssh protokolü RFC 4254'te açıklanmaktadır . Bir mesaj akışından oluşur. Böyle bir mesaj, "pty-req"sözde bir terminal talep eder ve parametreleri terminal yüksekliğini ve genişliğini içerir.

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

Telnet ve ssh istemcileri SIGWINCHsinyali yakalar , böylece bir oturum sırasında bir terminal penceresini yeniden boyutlandırırsanız, sunucuya yeni boyutla uygun bir ileti gönderir. Ssh Pencere Boyutu Değişiklik Mesajı gönderir:

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

Gerçekte göndermek için kullanabileceğiniz onaltılı değerlerin bir örneğini güncelleyebilir misiniz Window Dimension Change Message? Hiçbir yerde bunun bir örneğini bulamıyorum.
MirroredFate

@MirroredFate Bu mesajı gönderen C kodu github.com/openssh/openssh-portable/blob/master/… şeklindedir . Gönderilen ham baytların nasıl görüldüğünü açıkça bilmiyorum; openssh kaynak koduna bir miktar günlük kaydı eklemeniz gerekebilir.
Mark Plotnick

2

Bunun sinyal yoluyla olduğundan şüpheleniyorum SIGWINCH--- muhtemelen borudan aşağıya teslim edildi.

Gönderen wikipedia :

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

Bir (in zsh) yaparsam :

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

... ve terminal boyutunu değiştiriyorum:

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

0

RFC 4254 Bölüm 6.9 Mesaj adı "pencere değişikliği" yeni boyutlarla gönderilir. Müşteri tarafında, orijinal SIGWINCH'in yakalandığı doğru olabilir, ancak inandığım bu mesajla gönderilir. https://www.ietf.org/rfc/rfc4254.txt

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.