md5sum चेकसम के लिए '\' प्रस्तुत करता है


22

Md5sum नाम में "\" के साथ फ़ाइल के चेकसम को खोजने पर चेकसम के सामने "\" को क्यों प्रचलित कर रहा है?

$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e  /tmp/test\\test

वही हर दूसरी उपयोगिता के लिए विख्यात है।


बस संदर्भ के लिए, GNU कोरुटिल्स में अन्य *sumउपयोगिताओं (जैसे md5sum, ई, जी, sha1sumआदि के समान परिवार ) का उपयोग करता है।
Kusalananda

मैं इस व्यवहार को नहीं देखता, उपयोगिता का संस्करण क्या है:md5sum --version
कीवी

@ कुसलानंद यह कोर्यूटिल्स संस्करण विशिष्ट हो सकता है; CentOS 7 पर cksumनहीं है; जैसे% cksum test\\test 3915528286 4 test\test
स्टीफन हैरिस

@StephenHarris शायद ऐसा इसलिए है क्योंकि cksumयह POSIX उपयोगिता और इसकी कल्पना है। इसकी अनुमति नहीं देता है।
Kusalananda

जवाबों:


33

यह है प्रलेखित , coreutils के लिए ' md5sum:

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

( फ़ाइल फ़ाइल नाम है, फ़ाइल की सामग्री नहीं)।

b2sum, sha1sumऔर विभिन्न SHA-2 उपकरण उसी तरह व्यवहार करते हैं जैसे md5sumsumऔर cksumनहीं; sumकेवल पीछे की ओर-संगतता के लिए प्रदान की जाती है (और अपने पूर्वजों उत्पादन नहीं उद्धृत उत्पादन करते हैं), और cksumहै POSIX द्वारा निर्दिष्ट और उत्पादन के इस प्रकार की अनुमति नहीं है।

यह व्यवहार नवंबर 2015 में पेश किया गया था और निम्न NEWSप्रविष्टि के साथ संस्करण 8.25 (जनवरी 2016) में जारी किया गया था :

md5sumअब मानक आउटपुट पर स्टेटस के लिए सिंगल लाइन प्रति फ़ाइल सुनिश्चित करता है, लाइन की शुरुआत में '\' का उपयोग करके, और किसी भी नई जगह को '\ n' से बदल देता है। यह भी प्रभावित करता है sha1sum, sha224sum, sha256sum, sha384sumऔर sha512sum

लाइन के शुरू में बैकस्लैश एक ध्वज के रूप में कार्य करता है: फ़ाइल नाम में पलायन केवल तभी संसाधित होता है यदि लाइन बैकस्लैश से शुरू होती है। (अनसेफ डिफॉल्ट व्यवहार नहीं हो सकता है: यह कोरुटिल्स के पुराने संस्करणों के साथ \\या \nसंग्रहित फिल्म्स में बनाए गए सॉम्स को तोड़ देगा ।)


30
यह पूरी तरह से अनजाने में कुछ शर्म की बात है man, हालांकि यह पृष्ठों में दर्ज़ नहीं है । (और हां, मुझे पता है कि GNU चाहता है कि हर कोई infoइसके बजाय अपने अत्यधिक जटिल पृष्ठों को पढ़ें ।)
roaima

3
@ रेखा के आरंभ में बैकस्लैश को एक झंडे के रूप में दिखाया गया है जो यह दर्शाता है कि फ़ाइल नाम में बैकस्लैश बच गया है; अन्यथा आपको पता नहीं होगा कि \nआदि को शाब्दिक रूप से संसाधित करना है या नहीं।
स्टीफन किट

3
@msouth यदि यह फ़ाइल नाम की शुरुआत में है, तो आपको यह जानने का कोई तरीका नहीं है कि क्या यह ध्वज है, या एक फ़ाइल नाम वास्तव में बैकस्लैश के साथ शुरू हो रहा है ...
स्टीफन किट

1
@StephenKitt मुझे नहीं लगता कि अग्रणी \ _ असंतोष के लिए है। अगर बैकस्लैश और न्यूलाइन्स से हमेशा बच निकलने के रूप में आउटपुट का दस्तावेजीकरण किया जाए तो कोई अस्पष्टता नहीं है। यह वहाँ है कि यदि आवश्यक न हो तो डी-एस्केपिंग करना पड़ता है। आप निश्चित रूप से बहस कर सकते हैं कि क्या यह इसके लायक है (व्यक्तिगत रूप से मुझे लगता है कि यह नहीं है, लेकिन मैं coreutilsयोगदानकर्ता नहीं हूं )।
टाइपिया

1
प्रलेखन का वाक्यांश "फ़ाइल नाम में प्रत्येक समस्याग्रस्त चरित्र एक बैकस्लैश के साथ बच गया है" गलत है; के साथ एक newline की जगह एक \nbackslash के साथ एक newline से बचने के रूप में ही नहीं है!
21

17

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

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

क्या इसका मतलब यह है कि दो फाइलें थीं fooऔर barकेवल एक फाइल किसका फाइलनेम है "foo\n25af89c92254a806b2e93fffd8ac1814 bar"? दी गई, यह बाद की संभावना अत्यधिक संभावना नहीं है, लेकिन यह संभव है। अस्पष्टता को हल करने के लिए डेवलपर्स ने बैकस्लैश ( \) के साथ नई कहानियों से बचने के लिए चुना । तब आउटपुट अलग-अलग हो जाता है। हालांकि, फिर एक और अस्पष्टता है:

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

क्या इस फ़ाइल के नाम में एक नई पंक्ति, या एक बैकस्लैश है जिसके बाद a है n? इसे हल करने के लिए हमें बैकस्लैश से भी बचना होगा, ताकि बाद वाला मामला बन जाए:

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

अंत में, उन्होंने प्रत्येक आउटपुट लाइन को तैयार करने के लिए चुना, जिसमें एगर के साथ इस तरह के पलायन होते हैं जिससे पार्सर के लिए यह पता लगाना \\आसान हो जाता है कि क्या बच गया है। संभवत: ऐसा पार्सर्स को गैर-भागने वाले संस्करणों (गैर-जीएनआर) से बचने के संस्करणों से आउटपुट को संभालने की अनुमति देने के लिए किया गया था । ध्वज का अर्थ यह भी है कि "महंगा" संयुक्त राष्ट्र से बचने की आवश्यकता नहीं होने पर करने की आवश्यकता नहीं है। आप अपने आप में कार्रवाई में इस पार्सिंग का एक उदाहरण देख सकते हैं (लिंक किए गए संस्करण में लाइन 382)।md5summd5sum.c


1 से न्यू लाइन मैं चरित्र मतलब \nहै जो कभी कभी भी विशेष रूप से एक के रूप में जाना जाता है linefeed या वामो ; देखते हैं md5sum.c


1
निश्चित रूप से समझदार व्यवहार एक नई पंक्ति वाली हर फ़ाइल पर पूरी तरह से प्रतिबंध लगाने के लिए होगा । बस उन्हें संसाधित करने से इंकार कर दें।
पाइप

1
@ यह पागल व्यवहार है। POSIX ऐसे फ़ाइल नामों की अनुमति देता है, और वैध रूप से वैध फ़ाइलों के साथ काम करने से इनकार करने वाली उपयोगिताओं खराब हैं और उन्हें आग से मारना चाहिए।
रुस्लान

2
@Ruslan इस तरह के असामाजिक नामों की अनुमति देने के लिए POSIX के खिलाफ विरोध करने की बात है । इस तरह के पात्रों को अनुमति देने से सुरक्षा के मुद्दों और कोड ब्लोट की एक बड़ी मात्रा के कारण केवल ऐसे विशेष मामलों को संभालने की संभावना होती है।
पाइप

@ पीएपी जबकि एक फ़ाइल नाम में LF वास्तव में असामाजिक है, आपके लिंक में उल्लिखित अन्य चीजें बहुत अधिक बहस योग्य हैं - जैसे रिक्त स्थान, गैर-लैटिन पत्र आदि ..
रुस्लान

इंजीनियरों द्वारा क्लासिक ओवर-इंजीनियरिंग। पाठ (अभी तक फिर से): इंजीनियरों को आवश्यकताओं को चलाने की अनुमति न दें। वे सबसे अस्पष्ट और जटिल मामला पाएंगे और इसे हावी मामले में बढ़ाएंगे और सभी को भ्रमित करेंगे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.