BASH और कैरिज रिटर्न बिहेवियर


11

मेरा एक त्वरित प्रश्न है।
क्या यह सामान्य है कि बैश (मैं 4.4.11 का उपयोग कर रहा हूं) लाइनों / पाठ को प्रदर्शित नहीं कर रहा है जो सादे के साथ अलग / समाप्त होता है \r?

मैं इस व्यवहार को देखकर थोड़ा हैरान था:

$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george

लेकिन "हैलो फिर से" पाठ अभी भी वहाँ है, किसी तरह "छिपा":

$ echo "$a" |od -w32 -t x1c
0000000  68  65  6c  6c  6f  0d  61  67  61  69  6e  0d  67  65  6f  72  67  65  0d  0a
          h   e   l   l   o  \r   a   g   a   i   n  \r   g   e   o   r   g   e  \r  \n

और जैसे ही हम बस बैश के साथ खेलते हैं ठीक है .... लेकिन क्या यह एक संभावित सुरक्षा जोखिम है? क्या होगा अगर चर की सामग्री "एक" बाहरी दुनिया से आती है और इसमें केवल हेलो के बजाय "खराब कमांड" शामिल हैं?

एक और परीक्षा, इस बार थोड़ा असुरक्षित:

$ a=$(printf "ls;\rGeorge\n")
$ echo "$a"
George
$ eval "$a"
0                   awkprof.out       event-tester.log  helloworld.c      oneshot.sh         rightclick-tester.py  tmp                    uinput-simple.py
<directory listing appears with an error message at the end for command George>

एक छिपे के rmबजाय एक कल्पना की कल्पना करो ls

इको-ई का उपयोग करते समय समान व्यवहार:

$ a=$(echo -e "ls;\rGeorge\r\n"); echo "$a"
George

क्या यह मैं हूँ जो कुछ गलत करता है ...?

जवाबों:


20

आपका echo "$a"प्रिंट "हैलो", फिर लाइन की शुरुआत में वापस चला जाता है (जो कि क्या \rहोता है), "फिर से" प्रिंट करें, फिर से वापस जाता है, "जॉर्ज" प्रिंट करता है, फिर से वापस जाता है, और अगली पंक्ति ( \n) में जाता है। यह सब पूरी तरह से सामान्य है, लेकिन जैसा कि चेपर बताते हैं, इसका बाश से कोई लेना-देना नहीं है: \rऔर इसकी \nव्याख्या टर्मिनल द्वारा की जाती है, न कि बश द्वारा (जो कि जब आप कमांड को पूरा करते हैं तो आपको पूरा आउटपुट मिलता है od)।

आप इससे बेहतर तरीके से देख सकते हैं

$ a=$(printf "hellooooo\r  again,\rgeorge\r\n")
$ echo "$a"

क्योंकि यह ओवरराइट पाठ के अंत को छोड़ देगा:

georgen,o

आप वास्तव में इसका उपयोग नहीं कर सकते, हालांकि, केवल उनके आउटपुट को छिपाने के लिए (और केवल यदि आप पर्याप्त वर्णों के साथ ओवरराइट करना सुनिश्चित कर सकते हैं), जब तक evalकि आप शो के रूप में उपयोग नहीं करते हैं (लेकिन evalआमतौर पर उपयोग करने की अनुशंसा नहीं की जाती है)। वेब साइट्स से कॉपी और पेस्ट किए जाने के इरादे से CSS को मास्क करने के लिए एक अधिक खतरनाक चाल का उपयोग किया जाता है।


पर्याप्त स्पष्ट, धन्यवाद। मैं अपने परीक्षण में एक अंतिम शब्द का उपयोग करने के लिए भाग्यशाली / अनलकी था जो पिछले दो शब्दों को पूरी तरह से लिखने में सक्षम था।
जॉर्ज वासिलिउ

2
ध्यान दें कि यह वास्तव में कुछ भी नहीं है bash, हालांकि; यह पूरी तरह से टर्मिनल पर निर्भर है कि कैरिज रिटर्न को "कैसे" प्रदर्शित किया जाए, या ओवरराइट अक्षरों को कैसे प्रदर्शित किया जाए। उदाहरण के लिए, टर्मिनल के लिए यह पूरी तरह से मान्य होगा कि -\r|केवल एक पाइप के बजाय एक प्लस चिह्न जैसा दिखने वाला कोई चीज़।
चेपनर

@chepner पता अच्छा है! साझा करने के लिए धन्यवाद। मैंने सोचा कि यह सिर्फ एक बकवास व्यवहार था।
जॉर्ज वासिलिउ

@GeorgeVasiliou नहीं, bashबस एक फ़ाइल को बाइट्स लिखते हैं; यह उन पर निर्भर करने के लिए उन बाइट्स को पढ़ता है।
चेपनर

नाइटपिक: printfजो एक बैश बिल्ट-इन कमांड है (हालाँकि यह एक स्टैंडअलोन एक्जीक्यूटेबल के रूप में भी मौजूद है), \r(दो बाइट्स का एक क्रम ) की व्याख्या करता है : 0x5cऔर 0x72गाड़ी का रिटर्न (एक सिंगल बाइट:) पैदा करता है 0x0d। फिर, हाँ, टर्मिनल। 0x0dएक विशेष तरीके से बाइट की व्याख्या करता है, लेकिन यह मूल स्ट्रिंग की व्याख्या नहीं करता है \r
Suzanne Dupéron

6

यूनिक्स की दुनिया में, एक गाड़ी वापसी (आमतौर पर \rप्रोग्रामिंग भाषाओं में एन्कोडेड ) एक अचूक नियंत्रण चरित्र है। आप पाठ की एक पंक्ति के अंदर कैरिएज रिटर्न हो सकता है एक लाइन फ़ीड (भी बुलाया से अलग किसी अन्य चरित्र की तरह न्यू लाइन ) है, जो अंक एक पंक्ति के अंत।

विशेष रूप से, एक बैश स्क्रिप्ट में, एक गाड़ी वापसी अक्षर और अंकों की तरह एक साधारण शब्द घटक चरित्र है। गाड़ी वापसी का कोई विशेष प्रभाव टर्मिनल से आता है, शेल से नहीं।

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

कई अन्य नियंत्रण वर्णों पर विशेष प्रभाव पड़ता है: बैकस्पेस वर्ण कर्सर को एक स्थान पर छोड़ देता है। घंटी का चरित्र टर्मिनल को एक ध्वनि का उत्सर्जन करने का कारण बनता है या अन्यथा उपयोगकर्ता का ध्यान आकर्षित करता है। भागने का चरित्र एक भागने का क्रम शुरू करता है जिसमें सभी प्रकार के विशेष प्रभाव हो सकते हैं।

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


0

आप printfफ़ंक्शन के साथ फ़ंक्शन का उपयोग करके किसी बैश वैरिएबल में गाड़ी के रिटर्न देख सकते हैं %q

$ TESTVAR="$(printf ' Version: 1 \r Build: 20180712 \r Test: 1324')"

$ printf %q $TESTVAR
Version:1$'\r'Build:20180712$'\r'Test:1324

स्रोत और आगे पढ़ने:

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