क्या द्विआधारी-सुरक्षित "तिहरे से कम" <<< ऑपरेटर बैश में है?


27

यह एक काल्पनिक सवाल है, इसलिए कृपया मुझसे यह न पूछें कि मैं ऐसा क्यों करना चाहता हूं।

यह मानते हुए कि मेरे पास एक चर GIFहै जिसमें बाइनरी डेटा शामिल है, और यह मानते हुए कि मैं पाइप |ऑपरेटर का उपयोग नहीं कर सकता , निम्न 'ऑपरेटर से कम-से-कम' ऑपरेटर का उपयोग करने का सही तरीका होना चाहिए :

openssl enc -base64 <<< $GIF

हालांकि, ऐसा लगता है कि मेरे लिए <<<नहीं है बाइनरी-सुरक्षित है और इसलिए बाइनरी डेटा भ्रष्ट हो जाता है।

क्या बाइनरी-सेफ समतुल्य है?


कृपया ध्यान दें कि बैश चर में NUL वर्ण नहीं हो सकते। तो आपका चर $GIF, एक शुरुआत के लिए, शुरू करने से पहले भी पूर्ण-बाइनरी धारण नहीं कर रहा है। हालांकि, एनयूएल चरित्र के अपवाद के लिए, यह अन्य सभी को पकड़ रहा है। (रेफरी के रूप में: vaab.blog.kal.fr/2014/05/03/… )
vabab

जवाबों:


30

यहाँ स्ट्रिंग पुनर्निर्देशन ( <<<) का एक सरल रूप है यहाँ दस्तावेज़ पुनर्निर्देशन ( <<)। यहां स्ट्रिंग पुनर्निर्देशन "बाइनरी सेफ" नहीं है; बैश यहाँ स्ट्रिंग पर विस्तार प्रदर्शन करेंगे। इसके अलावा, बैश यहां स्ट्रिंग के अंत में एक नई-लाइन संलग्न करेगा (कमांड जारी करें xxd -p <<< "foo"और आपको 666f6f0aबदले में मिलेगा )।

आपकी एकमात्र सुरक्षित शर्त, पाइप को छोड़कर, I / O पुनर्निर्देशन है

यहां बाइनरी सुरक्षित प्रश्न के समान नहीं है । आप एन्कोडेड डेटा स्टोर कर सकते हैं और यह कोशिश कर सकते हैं

COMMAND_WITH_BIN_INPUT <(uudecode <(echo "$uuEncodedData")) 

हालाँकि यह बहुत दूर नहीं है

echo "$uuEncodedData"|uudecode|COMMAND_WITH_BIN_INPUT

लेकिन पाइप मेटाकार के बिना।


1
पहला लिंक अब मौजूद नहीं है इसलिए उत्तर में अधिक से अधिक जानकारी शामिल करने का महत्व, भले ही यह पहली बार में बहुत अधिक प्रकट हो, क्योंकि इससे जुड़ी जानकारी हमेशा के लिए नहीं रहती है।
वेस्ले

"यहां के तार" के लिए वैकल्पिक लिंक: linux.die.net/abs-guide/x15683.html
JJC

1
या, कोशिश करें od -a <<< ""और आप nlहेक्स मान के बजाय देखेंगे ।
jcalfee314

@Wesley वहाँ भी है। :) मूल लिंक: web.archive.org/web/20120126213653/http://tldp.org/LDP/abs/html/…/
जेसन सी

4

बश सामान्य रूप से बाइनरी सुरक्षित नहीं है, और प्रतिस्थापन के दौरान बाइनरी सामग्री वाले चर में नल और न्यूलाइन को भ्रष्ट करेगा।

इसलिए मुझे लगता है कि उत्तर "नहीं" है, लेकिन अधिक मौलिक रूप से "शेल स्क्रिप्टिंग भाषा में नहीं" है, क्योंकि वे सभी द्विआधारी के साथ समस्याएं हैं।

हालांकि मैं कहूंगा कि आप डेटा को $ GIF में प्राप्त करने की योजना बनाते हैं, आप इसके बजाय इसे एक फ़ाइल में प्राप्त करते हैं, या एक वैकल्पिक स्क्रिप्टिंग भाषा के रूप में अजगर का उपयोग करते हैं जो समस्याओं के बिना बाइनरी डेटा को संभाल लेगा।


1
संदर्भ या सटीक, या सरल उदाहरण आपके पक्ष से एक जंगली अनुमान और सामान्य भावना से अधिक सहायक होते। बश के माध्यम से बाइनरी डेटा प्राप्त करने के तरीके हैं।
vabab

@ ओवाब हां, आप ऊपर दिए गए उत्कीर्ण और स्वीकृत उत्तर देख सकते हैं।
पॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.