एसएसएच और टेलनेट पर टर्मिनल की लंबाई और चौड़ाई कैसे अग्रेषित की जाती है?


15

जब मैं अपने टर्मिनल एमुलेटर की लंबाई और चौड़ाई को देखता हूं, stty sizeतो यह 271 अक्षर लंबा और 71 लाइन लंबा होता है। जब मैं एसएसएच पर एक और सर्वर में लॉग इन करता हूं और निष्पादित करता हूं stty size, तो यह भी 271 वर्ण लंबा और 71 लाइन लंबा होता है। मैं कुछ सिस्को IOS डिवाइस में भी लॉग इन कर सकता हूं और टर्मिनल अभी भी 271 वर्ण लंबा और 71 लाइन लंबा है:

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

अब अगर मैं स्थानीय मशीन में अपने टर्मिनल एमुलेटर (गनोम टर्मिनल) खिड़की का आकार बदलूं, दोनों stty size दूरस्थ सर्वर और आईओएस में "शो टर्मिनल" अलग-अलग लंबाई और लाइनों की संख्या दिखाते हैं। एसएसएच और टेलनेट पर टर्मिनल की लंबाई और चौड़ाई कैसे अग्रेषित की जाती है?

जवाबों:


20

टेलनेट प्रोटोकॉल, में वर्णित RFC 854 , से मिलकर, इन-बैंड आदेश भेजने के लिए एक रास्ता भी शामिल आईएसी चरित्र , '\255', कई और अधिक बाइट्स द्वारा पीछा किया। ये कमांड रिमोट को एक बाधा भेजने जैसी चीजें कर सकते हैं, लेकिन आमतौर पर उनका उपयोग विकल्प भेजने के लिए किया जाता है ।

Microsoft Q231866 में टर्मिनल प्रकार का विकल्प भेजने वाले एक्सचेंज पर एक विस्तृत विवरण पाया जा सकता है ।

विंडो का आकार विकल्प में वर्णन किया गया आरएफसी 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

टेलनेट और एसएचएस क्लाइंट 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 वह संदेश भेजने वाला C कोड github.com/openssh/openssh-portable/blob/master/… है । मुझे पता नहीं है कि कैसे भेजे जाने वाले कच्चे बाइट्स को देखना है; आपको ओपनश सोर्स कोड में कुछ लॉगिंग जोड़ना पड़ सकता है।
मार्क प्लॉटनिक

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 संदेश का नाम "विंडो-परिवर्तन" नए आयामों के साथ भेजा गया है। क्लाइंट की ओर से यह सही हो सकता है कि मूल SIGWINCH पकड़ा जाता है, लेकिन यह उस संदेश के माध्यम से भेजा जाता है जो मुझे विश्वास है। https://www.ietf.org/rfc/rfc4254.txt

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.