टर्मिनल को तोड़ने से यादृच्छिक कंसोल आउटपुट को कैसे रोकें?


23

एसई पर कई सवाल हैं जो बताते हैं कि कैसे टूटे हुए टर्मिनल से उबरना है cat /dev/urandom। इस मुद्दे से अपरिचित लोगों के लिए - यहाँ इसके बारे में क्या है:

  1. आप निष्पादित cat /dev/urandomया समकक्ष (उदाहरण के लिए cat binary_file.dat)।
  2. कचरा छपता है।
  3. यह ठीक होगा ... आपके टर्मिनल को छोड़कर कचरा समाप्त होने के बाद भी कमांड समाप्त हो गया है! यहाँ एक गलत पाठ का स्क्रीनशॉट है जो वास्तव में g ++ आउटपुट है:

    उदाहरण स्क्रीनशॉट

    मुझे लगता है कि लोग C ++ त्रुटियों के बारे में सही थे, कभी-कभी बहुत अधिक गूढ़ होते हैं!

सामान्य समाधान चलाना है stty sane && reset, हालांकि हर बार ऐसा होने पर इसे चलाने के लिए परेशान होना पड़ता है।

इस वजह से, मैं इस सवाल पर ध्यान केंद्रित करना चाहता हूं कि मूल कारण ऐसा क्यों होता है, और इस तरह के आदेश जारी होने के बाद टर्मिनल को टूटने से कैसे रोका जाए । मैं ऐसे समाधानों की तलाश नहीं कर रहा हूं जैसे कि आक्रामक कमांड को पाइप करनाtr या xxd, क्योंकि इसके लिए आपको यह जानना आवश्यक है कि प्रोग्राम / फ़ाइल आउटपुट बाइनरी इससे पहले कि आप वास्तव में इसे चलाते / प्रिंट करते हैं, और आपको ऐसे डेटा को आउटपुट करने के लिए हर बार याद रखने की आवश्यकता होती है। ।

मैं URxvt, PuTTY और लिनक्स फ्रेम बफर में एक ही व्यवहार देखा तो मुझे नहीं लगता कि यह टर्मिनल-विशिष्ट समस्या है। मेरा प्राथमिक संदेह यह है कि यादृच्छिक आउटपुट में कुछ ANSI एस्केप कोड होता है जो चरित्र एन्कोडिंग को फ़्लिप करता है (वास्तव में, यदि आप cat /dev/urandomफिर से चलाते हैं, तो संभावना है कि यह टर्मिनल को अनब्रेक कर देगा , जो इस सिद्धांत की पुष्टि करता है)। यदि यह सही है, तो यह पलायन कोड क्या है? क्या इसे अक्षम करने के लिए कोई मानक तरीके हैं?

जवाबों:


22

नहीं:

  • "इसे अक्षम करने" के लिए कोई मानक तरीका नहीं है, और
  • टूटने का विवरण वास्तव में टर्मिनल-विशिष्ट हैं, लेकिन
  • कुछ सामान्य रूप से कार्यान्वित विशेषताएं हैं जिनके लिए आप दुर्व्यवहार कर सकते हैं।

आमतौर पर कार्यान्वित की जाने वाली सुविधाओं के लिए, VT100- शैली के वैकल्पिक वर्ण सेट को देखें, जो कि ^Nऔर ^O( सक्रिय / अक्षम) द्वारा सक्रिय है । यही कारण है कि कुछ टर्मिनलों में जब UTF-8 मोड का उपयोग कर दबाया जा सकता है, लेकिन एक ही टर्मिनल अपनी स्क्रीन trashing भागने दृश्यों के साथ वे (जीएनयू स्क्रीन, लिनक्स कंसोल, पुट्टी यहाँ के बारे में बात) के लिए पर्याप्त अवसर है करना स्वीकार करते हैं।

मिसाल के तौर पर कुछ अन्य एस्केप सीक्वेंस टर्मिनल से क्वेरी (एस्केप सीक्वेंस) पर होस्ट के जवाबों पर भरोसा करते हैं। यदि होस्ट इसकी उम्मीद नहीं करता है, तो परिणाम स्क्रीन पर कचरा है।

अन्य मामलों में (लिनक्स कंसोल के लिए हार्डकोडेड एस्केप सीक्वेंस के साथ नेटवर्क डिवाइस में उदाहरण के लिए देखा गया है), अन्य टर्मिनलों को मिसकैडेड के रूप में देखेंगे और फ्रीज करने लगते हैं।

इसलिए ... आप सिर्फ एक टर्मिनल पर ध्यान केंद्रित कर सकते हैं, जो कुछ भी उपद्रव की तरह दिखता है उसे बाहर निकाल दें (उदाहरण के लिए, कुछ संपादकों में स्थिति के लिए माउस का उपयोग करने की क्षमता को हटाने का सुझाव देते हैं), और आपको कुछ ऐसा मिल सकता है जिसमें कोई स्पष्ट छेद नहीं है। लेकिन वह केवल एक ही टर्मिनल है।


0

यदि आपका नियंत्रण और पता है कि कोई कमांड आपको खराब करने जा रही है, तो मैं आमतौर पर आउटपुट को कम जैसी चीज़ में देखूंगा।

head -n4 /dev/urandom | less

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


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

-1

अपने कमांड आदि के आउटपुट को टी - में पाइप करें -


2
वह कैसे मदद करेगा? यह अभी भी आउटपुट प्रिंट करेगा, लेकिन इसे एक फाइल में भी सेव करेगा।
बरमार

शायद आपका मतलब था moreया less?
बरमार

मेरे जोर देने के साथ ओपी प्रति: "... के बाद । इस तरह के आदेश जारी किया जाता है मुझे नहीं जैसे समाधान के लिए देख रहा हूँ पाइप हमलावर कमांड"
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.