"ओनली dgst -sha1" एक बाहरी "(स्टडिन) =" का निर्माण "उपसर्ग और नई अनुगामी


31

यदि आप इस कमांड को अपने यूनिक्स पर चलाते हैं

echo -n "foo" | openssl dgst -sha1

आपको यह आउटपुट मिलेगा:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(इसके बाद एक नई पंक्ति)।

मैं (stdin)=उपसर्ग को नहीं दिखाने और अनुगामी न्यूलाइन से बचने के लिए कैसे खुलता है?


@MarkDavidson हम्म, दिलचस्प। क्या आपको यकीन है कि यह एक नई रूपरेखा भी नहीं जोड़ता है?

जवाबों:


22

कच्चा बाइनरी प्रारूप किसी भी बाहरी आउटपुट को नहीं जोड़ता है।
बाइनरी के रूप में आउटपुट तब हेक्स में परिवर्तित होता है:

echo -n "foo" | openssl dgst -sha1 -binary | xxd -p

आपको यह देगा:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

यह विधि भविष्य में प्रूफ होनी चाहिए, जब कोई व्यक्ति फिर से टेक्स्टुअल आउटपुट फॉर्मेट को बदलने का फैसला करता है। मुझे यकीन है कि वे "SHA1 (स्टडिन) =" होने के लिए उपसर्ग को ठीक करेंगे, जो कि फ़ाइल इनपुट के अनुरूप होगा।

मैं विश्वास नहीं कर सकता कि उन्होंने इसे बदल दिया है! मुझे आश्चर्य है कि कितनी पटकथाओं को तोड़ा गया।


4
यह केवल 20-30 ऑक्टेट प्रति पंक्ति (या 40-60 वर्ण) आउटपुट देगा। SHA-256 चेकसम के लिए, यह कभी-कभी पर्याप्त नहीं होता है। -c 256इसे 256 ऑक्टेट प्रति पंक्ति तक विस्तारित करने के लिए विकल्प का उपयोग करें ।
रॉकलाईट

16

मैं Ubuntu 11.10 पर OpenSSL 1.0.0e के तहत इस व्यवहार का निरीक्षण करता हूं, जबकि OpenSSL 0.9.8k और 0.9.8t आउटपुट सिर्फ हैश। ओपनएसएसएल की कमांड लाइन लचीली होने के लिए नहीं बनाई गई है, यह कमांड लाइन से क्रिप्टोग्राफिक गणना करने के लिए एक त्वरित और गंदे तरीके से अधिक है।

यदि आप ओपनएसएसएल का उपयोग करना चाहते हैं, तो आउटपुट को फ़िल्टर करें:

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'

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

echo -n "foo" | sha1sum | sed 's/ .*//'

OSD सहित BSD सिस्टम पर, आप उपयोग कर सकते हैं sha1

echo -n "foo" | sha1 -q

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

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

यदि आपको एक ऐसे प्रोग्राम में इनपुट को पाइप करने की आवश्यकता है जिसमें कोई अंतिम न्यूलाइन (जो वास्तव में दुर्लभ है) के साथ एक चेकसम की आवश्यकता होती है, तो न्यूलाइन को बंद कर दें।

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program

यह सही स्थिति है => कॉपी और पेस्ट सॉल्यूशन मैप। धन्यवाद!
ओबर्स्टेट

6

यहाँ एक और विकल्प है:

echo -n "foo" | openssl sha1 | awk '{print $2}'

1
मुझे पता है कि इस विशिष्ट प्रारूप के साथ पूछे जाने वाले प्रश्न, हालांकि, अगर कोई फ़ाइल नाम शामिल करने के लिए इसे विस्तारित करने का प्रयास करता है, तो यह टूट सकता है यदि फ़ाइल नाम में रिक्त स्थान है। यहाँ उतरने वाले अन्य लोगों के लिए बस एक सिर है।
कैमरून गगनोन

2

यहाँ पाइप, awk, sed, tr, cut, आदि के बजाय bash बिल्ट इन का उपयोग करने का एक तरीका है:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.