ความยาวและความกว้างของเทอร์มินัลส่งต่อผ่าน SSH และ telnet อย่างไร


15

เมื่อฉันดูความยาวและความกว้างของเทอร์มินัลอีมูเลเตอร์ของฉันด้วยความstty sizeยาว 271 ตัวอักษรและ 71 บรรทัดสูง เมื่อฉันเข้าสู่เซิร์ฟเวอร์อื่นผ่าน SSH และดำเนินการstty sizeแล้วก็มี 271 ตัวอักษรและ 71 บรรทัดสูง ฉันยังสามารถลงชื่อเข้าใช้อุปกรณ์ Cisco IOS และเทอร์มินัลยังมีความยาว 271 ตัวอักษรและสูง 71 บรรทัด:

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

ตอนนี้ถ้าฉันปรับขนาดหน้าต่างเทอร์มินัลอีมูเลเตอร์ (เทอร์มินัล Gnome) ในเครื่องท้องถิ่นทั้งstty sizeในเซิร์ฟเวอร์ระยะไกลและ "เครื่องปลายทาง" ใน IOS แสดงความยาวบรรทัดที่แตกต่างกันและจำนวนบรรทัด ความยาวและความกว้างของเทอร์มินัลส่งต่อผ่าน SSH และ telnet อย่างไร

คำตอบ:


20

โปรโตคอล Telnet ที่อธิบายไว้ในRFC 854รวมถึงวิธีการที่จะส่งคำสั่งในวงประกอบด้วยอักขระ IAC , '\255'ตามด้วยอีกหลายไบต์ คำสั่งเหล่านี้สามารถทำสิ่งที่ต้องการส่งขัดจังหวะระยะไกล แต่โดยทั่วไปแล้วพวกเขากำลังใช้ในการส่งตัวเลือก

ดูรายละเอียดที่แลกเปลี่ยนที่ส่ง ๆประเภทอาคารตัวเลือกที่สามารถพบได้ในMicrosoft Q231866

ขนาดหน้าต่างตัวเลือกที่อธิบายไว้ในRFC 1073 ลูกค้าส่งความเต็มใจในการส่งNAWSตัวเลือกก่อน หากเซิร์ฟเวอร์ตอบกลับDO NAWSไคลเอนต์สามารถส่งNAWSข้อมูลตัวเลือกซึ่งประกอบด้วยค่า 16 บิตสองค่า

ตัวอย่างเซสชันบนเทอร์มินัลคอลัมน์ 47 แถว 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)

โปรโตคอล SSH อธิบายไว้ในRFC 4254 ประกอบด้วยกระแสข้อความ หนึ่งข้อความดังกล่าวคือ"pty-req"ที่ร้องขอสถานีหลอกและพารามิเตอร์รวมถึงความสูงและความกว้างขั้ว

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 และ ssh จะจับSIGWINCHสัญญาณดังนั้นหากคุณปรับขนาดหน้าต่างเทอร์มินัลในระหว่างเซสชันพวกเขาจะส่งข้อความที่เหมาะสมไปยังเซิร์ฟเวอร์ด้วยขนาดใหม่ Ssh ส่งข้อความการเปลี่ยนแปลงมิติหน้าต่าง:

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

คุณสามารถอัปเดตด้วยตัวอย่างของค่าเลขฐานสิบหกที่คุณสามารถใช้เพื่อส่งได้จริงWindow Dimension Change Messageหรือ ฉันไม่สามารถหาตัวอย่างได้ทุกที่
MirroredFate

รหัส @MirroredFate ซีที่ส่งข้อความที่เป็นgithub.com/openssh/openssh-portable/blob/master/... ฉันไม่รู้วิธีการดูไบต์แบบดิบที่ส่งไป คุณอาจต้องเพิ่มการบันทึกลงในซอร์สโค้ด openssh
Mark Plotnick

2

ฉันสงสัยว่ามันผ่านสัญญาณSIGWINCH--- อาจส่งลงท่อ

จากวิกิพีเดีย :

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

ถ้าฉันทำ (ในzsh):

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

... และฉันแก้ไขขนาดเทอร์มินัล:

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

0

RFC 4254 ส่วน 6.9 ชื่อข้อความ "window-change" ถูกส่งไปพร้อมมิติข้อมูลใหม่ ในด้านไคลเอนต์มันอาจเป็นจริง SIGWINCH ดั้งเดิมถูกจับได้ แต่มันถูกส่งผ่านข้อความที่ฉันเชื่อ https://www.ietf.org/rfc/rfc4254.txt

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.