बैकस्पेस के लिए crtl-H का उपयोग करने के लिए फ़ोर्स टेलनेट / ssh


9

मेरे पास सिस्को सीरियल टर्म सर्वर से जुड़े कुछ उपकरण हैं; कई काम ठीक है जब मैं telnetसीधे सिस्को बंदरगाह पर आता हूं । हालाँकि, मेरे पास कुछ ज़िद्दी डिवाइस हैं जिनका उपयोग नहीं किया जाएगा Backspaceक्योंकि यह डिफ़ॉल्ट रूप से टेलनेट में मैप किया जाता है।

मामले में यह मायने रखता है, मैं rxvtडेबियन निचोड़ के तहत (एक एक्स विंडो में) से टेलनेट करता हूं । TERMकरने के लिए सेट कर दिया जाता rxvtहै, लेकिन यह है कि क्या मैं का उपयोग बात नहीं है vt100, vt101या, xterm... बदल रहा है TERMकोई प्रभाव नहीं है। मैंने TERMएक पुराने Kermit FAQ में जो देखा, उसके आधार पर मैंने सड़क बदलने की शुरुआत की । FWIW, stty erase ^hऔर stty erase ^?या तो काम नहीं करते।

मैंने देखा है कि Backspaceअगर मैं कच्चे टीसी सॉकेट का उपयोग करता हूं तो इन उपकरणों पर सही ढंग से काम करता है netcat... अर्थात nc 192.168.12.117 2006; हालाँकि, तब मैं अन्य मुद्दों में पासवर्ड छिपा या टर्मिनल पेजिंग के साथ चलता हूं।

मैं इन उपकरणों के लिए मैप Backspaceकरने के CtrlHलिए टेलनेट और ssh को कैसे चुन सकता हूं ? इसके अलावा, मुझे यह मूल्यांकन करने के लिए क्या मापदंड का उपयोग करना चाहिए कि क्या यह डिवाइस में बग है?

संपादित करें

मामले में यह मायने रखता है, यह showkey -aप्रश्न में कुंजियों के लिए आउटपुट है ... से ^?मेल खाती है Backspaceऔर ^Hहै CtrlH। ऐसा लगता है कि जब मैं लिनक्स कीबोर्ड और कंसोल हॉव्टो को देखता हूं, तो मुझे पास होना चाहिए , लेकिन मैं इसे बदलने के लिए क्या कर सकता हूं इसे समझने की जरूरत नहीं है। मैंने loadkeysबिना किसी प्रभाव के विभिन्न आसनों की कोशिश की है।

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f
^H        8 0010 0x08

मैं भी प्रासंगिक उत्पादन के dumpkeysसाथ ही शामिल हूँ ... यह मेरे सिस्टम में वर्तमान मानचित्रण है (जो कि कुछ उपकरणों पर काम नहीं करता है)। अगर मुझे समझ में आ जाए कि कैसे Backspaceएक जैसा काम CtrlHकरना है, तो मेरे पास एक उपाय होगा।

[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode   8 = BackSpace        ampersand        braceleft       
keycode  14 = BackSpace        Delete          
        control keycode  14 = BackSpace       
keycode 127 =
[mpenning@hotcoffee docs]$

1
क्या आपने कोशिश की है ssty erase '^?'? यदि डिवाइस एक पर जोर देते हैं C-h, तो यह टेलनेट की कॉल नहीं है, यह टर्मिनल (एमुलेटर) का है।
गिल्स एसओ- बुराई को रोकना

@ आपकी टिप्पणी वास्तव में सही नहीं है, मेरा जवाब नीचे देखें
माइक पेनिंगटन

जवाबों:


10

मुझे आखिरकार ऐनी बरेटा के लिनक्स कीबोर्ड हॉल ऑफ शेम में एक उत्तर मिला ... ऐसा लगता है कि कुंजी मैपिंग को बदलना xterm/ के rxvtलिए अच्छा नहीं हैtelnet

टेलनेट कनेक्शन को सूँघने पर मैंने इसे मान्य किया। पहले मैंने टेलनेट सत्र को सूँघा और देखा कि मेजबान को Backspaceभेजा 0x7fगया है। इसके बाद मैं जानबूझकर उपयोग करने में टूट Backspaceगया (इस प्रकार मेरे बैकस्पेस को डॉलर चिह्न में मैप कर रहा हूं )। ऐसा करने के बाद, मुझे बैकस्पेस में हिट करना था , लेकिन फिर भी जब मुझे रिमोट होस्ट पर उपयोग किया गया तो भेजा गया।rxvtstty erase $rxvt$rxvttelnet0x7fBackspace

समाधान

kbdfix(नीचे) नामक एक स्क्रिप्ट बनाएं , और इसे 755अनुमतियों के साथ निष्पादन योग्य बनाएं ; आपको अपने वितरण अभिलेखागार से लोड किए गए पैकेज tclshऔर expectपैकेज की आवश्यकता होगी ।

#!/usr/bin/expect

#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv

interact {
 \177        {send "\010"}
 "\033\[3~"  {send "\177"}
}

अब टूटे हुए मेजबानों से कनेक्ट करने के लिए, मैं टाइप करता हूं kbdfix telnet 192.168.12.117 2006, और Backspaceकाम करता हूं ।

2006 से ऊपर के किसी भी भ्रमित व्यक्ति के लिए ध्यान दें ... यह टीसीपी पोर्ट है जो सिस्को शब्द सर्वर टूटे हुए डिवाइस के कंसोल के लिए सीरियल कनेक्शन के लिए उपयोग करता है (इस मामले में, ब्रोकेड एफसीएक्स स्विच)।

यदि आप केवल उस डिवाइस को टेलनेट कर रहे हैं जो पसंद नहीं करता है Backspace, तो आप उपयोग करेंगे kbdfix telnet <addr_of_the_broken_device>। मैं भी ssh के साथ इसका उपयोग कर रहा हूँ जब मैं एक dinkink dgs-3200 ईथरनेट स्विच के लिए ssh है कि इसी तरह की समस्या है; वाक्य रचना है kbdfix ssh 172.16.1.26


2
stty erase $"बैकस्पेस" कुंजी को "$" में मैप नहीं करता है, यह ट्टी ड्राइवर को बताता है कि एक चरित्र को मिटाने के लिए, "$" कुंजी का उपयोग करने की आवश्यकता है। जब आप टेलनेट चलाते हैं, तो आप कच्चे मोड में होते हैं इसलिए इस सेटिंग को अनदेखा कर दिया जाता है। एक सरल समाधान यह होगा कि आप अपने टर्मिनल एमुलेटर को बैकस्पेस के लिए ^ H को भेजने के लिए कॉन्फ़िगर करें, जैसा कि इरादा है, एक अन्य आपके हैक का उपयोग कर रहा है जो उम्मीद का उपयोग करके मक्खी पर इन वर्णों का अनुवाद करता है।
जूलियाग्रे

@ जैलीग्रे, हां, मुझे पता चला कि जब मैंने उपयोग किया था तो कीबोर्ड के sttyबदलाव को कैसे नहीं बदला ; हालाँकि, यह महत्वपूर्ण तथ्य मेरे लिए तब तक स्पष्ट नहीं था जब तक मैं सूँघ नहीं गया। मैं जांच करेंगे कि कैसे मैं उपयोग करने के लिए बैकस्पेस बदल सकते में है ... या शायद मैं एक और शब्द खोजने के बारे में सोचने की जरूरत। telnetwiresharkControl_hrxvt
माइक पेनिंगटन

@ माइक: मुझे लगता है कि आप अभी भी कुछ के बारे में उलझन में हैं (जो मैं न तो jlliagre मानता हूं और न ही मैंने स्पष्ट रूप से उल्लेख किया है। मैंने अपना उत्तर अपडेट कर दिया है)। sttyआवेदन पक्ष पर चलाने की जरूरत है। मुझे अत्यधिक संदेह telnetहै कि इनपुट पात्रों का अनुवाद किया जा रहा है या जिन्हें आपको उपयोग करने की आवश्यकता है script; बस sttyरिमोट मशीन पर चल रहा है शायद चाल होगा।
गिल्स एसओ- बुराई को रोकना '19

@ गिल्स, रिमोट मशीन एक नेटवर्क डिवाइस है, इसमें नहीं है stty
माइक पेनिंगटन

1
@ माइक: जब आप नेटकाट का उपयोग करते हैं, तो आपका टर्मिनल पका हुआ मोड में है: आप एक पंक्ति लिखते हैं, इसे स्थानीय रूप से संपादित करते हैं , और Enterइसे भेजते हैं। जब आप टेलनेट का उपयोग करते हैं, तो आपका टर्मिनल कच्चे मोड में होता है: प्रत्येक वर्ण को तुरंत आवेदन पर भेजा जाता है। उदाहरण के लिए इस पृष्ठ की शुरुआत , या इस विकिपीडिया लेख को देखें
गिल्स एसओ- बुराई को रोकना '19

3

बैकस्पेस और कंट्रोल-एच को एक ही चीज के रूप में डिजाइन किया गया था, लेकिन आजकल, विशेष रूप से लिनक्स पर, आपको अक्सर बैकस्पेस भेजना और कुछ विषम भागने अनुक्रम भेजना होता है।

किसी भी स्थिति में और जहाँ तक मुझे पता है, टेलनेट या टीईआरएम वैरिएबल को नहीं बदलना चाहिए जो बैकस्पेस भेजता है, यह आमतौर पर एक टर्मिनल इमिशन कॉन्फ़िगरेशन सुविधा है।


आपका प्रश्न इस धारणा पर आधारित है कि टेलनेट बैकस्पेस कुंजी का विशिष्ट प्रसंस्करण कर रहा है जो मुझे लगता है कि गलत है। मुझे एक उत्तर के बजाय वास्तव में एक टिप्पणी के रूप में रखना चाहिए था।
जुलियाग्रे

AFAICT, telnetकीबोर्ड के स्थानीय टर्मिनल मैपिंग पर कोई ध्यान नहीं देता है। ऐनी बरेटा के कीबोर्ड और टेलनेट के बारे में नोट्स
माइक पेनिंगटन

मुझे डर है कि तुम गलत समझ रहे हो कि स्ट्टी क्या करता है।
जूलियाग्रे

3

प्रोग्राम को यह पता लगाने के लिए टर्मिनल सेटिंग्स को क्वेरी करना है कि बैकस्पेस वर्ण क्या है ( ^hऔर ^?, यानी \010और \177, दो विकल्प हैं)। अपने टर्मिनल को जो भेजता है, उसका उपयोग करने stty erase '^h'या stty erase '^?'घोषित करने के लिए।

यदि आप टर्मिनल के अंदर दूरस्थ रूप से (टेलनेट, आरएचएस या एसएचएस के साथ) लॉग इन करते हैं, तो ध्यान दें कि आपको stty आवेदन पक्ष पर चलना चाहिए । sttyटर्मिनल को कुछ अलग करने के लिए नहीं कहता है, यह टर्मिनल के बारे में स्थानीय टर्मिनल चालक (यानी टर्मिनल में चलने वाले अनुप्रयोगों के साथ इंटरफेस करने वाला हिस्सा) (ऐतिहासिक रूप से एक भौतिक वस्तु, अब एक टर्मिनल एमुलेटर) सेटिंग्स को सूचित करता है। इसी तरह, यदि आप स्क्रीन या इसी तरह के टर्मिनल-इन-टर्मिनल सॉफ़्टवेयर चलाते हैं, तो आपको sttyप्रत्येक स्क्रीन विंडो में चलाने की आवश्यकता होती है (लेकिन आमतौर पर स्क्रीन को इसकी कॉन्फ़िगरेशन फ़ाइल से सही काम करने के लिए कॉन्फ़िगर किया जा सकता है, अगर यह बॉक्स से बाहर काम नहीं करती है )।

व्यवहार में अंतर जो आप netcatबनाम से देखते हैं कि telnetटर्मिनल का उपयोग करने के तरीके के कारण है: * netcat में, टर्मिनल लाइन-बाय-लाइन मोड में है (जिसे "पकाया मोड" भी कहा जाता है)। आप एक पंक्ति को संपादित करते हैं (स्थानीय टर्मिनल के अंतर्निहित संस्करण सुविधा का उपयोग करके, और विशेष रूप से स्थानीय स्टटी सेटिंग्स), फिर इसे अपने अंतिम राज्य में दूरस्थ होस्ट को भेजें। * टेलनेट में, एक स्थानीय (स्थानीय) टर्मिनल चरित्र-दर-वर्ण मोड में है (जिसे "कच्चा मोड" भी कहा जाता है)। हर कीस्ट्रोके सीधे टेलनेट पर जाता है जो इसे रिमोट सिस्टम को तुरंत रिले करता है। आप दूरस्थ सिस्टम की लाइन संस्करण सुविधाओं पर निर्भर हैं।

वहाँ बाहर टूटे हुए कार्यक्रम हैं जो टर्मिनल सेटिंग्स के बारे में परवाह नहीं करते हैं। लगता है कि आप उनमें से एक का सामना कर चुके हैं। आपका सबसे अच्छा शर्त आपके टर्मिनल के कॉन्फ़िगरेशन को बदलना है। यदि आपको किसी दूरस्थ प्रोटोकॉल जैसे टेलनेट या एसएसएच पर डिवाइस के साथ संचार करने की आवश्यकता होती है, तो यह समान हो जाता है और डिवाइस कॉन्फ़िगर करने योग्य नहीं है।

Xterm के साथ, यह आसान है: BackSpaceरन-टाइम में कुंजी द्वारा भेजे गए वर्ण को टॉगल करने के लिए एक सेटिंग है । बाएं बटन मेनू से, "डिलीट DEL है" को टॉगल करें। प्रोग्रामेटिक रूप से, भागने के अनुक्रम \e[?67h को BackSpaceभेजने के लिए ^h, या भेजने के \e[?67lलिए BackSpaceभेजें ^?। संगत संसाधन है XTerm.backarrowKeyIsErase। अन्य टर्मिनल एमुलेटर में एक समान इंटरफ़ेस सुविधा हो सकती है या भागने के क्रम का समर्थन हो सकता है।

कई टर्मिनल एमुलेटर आप में से एक ^hया ^?जब आप प्रेस करते हैं BackSpace, और दूसरा कैरेक्टर जब आप Ctrl+ दबाते हैं तो भेजते हैं BackSpace। यह एक चुटकी में उपयोगी हो सकता है।

ध्यान दें कि showkeysऔर मित्र केवल लिनक्स कंसोल पर प्रासंगिक हैं, एक्स के भीतर नहीं।

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