मैं कमांड लाइन से बेस 64 स्ट्रिंग को कैसे डीकोड कर सकता हूं?

मैं बेस 64 स्ट्रिंग को डीकोड करने के लिए बैश स्क्रिप्ट लिखना चाहूंगा । उदाहरण के लिए मैं टाइप करता हूं decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== और यह प्रिंट करता है Aladdin:open sesame और प्रॉम्प्ट पर लौटता है ।

अब तक मैंने एक साधारण बैश फ़ाइल की कोशिश की है python -m base64 -d $1 लेकिन यह कमांड एक फ़ाइल नाम की अपेक्षा करता है जो स्ट्रिंग नहीं है । क्या कोई अन्य गैर-इंटरैक्टिव कमांड है (जरूरी नहीं कि एक पायथन मॉड्यूल में) जिसे मैं इसे प्राप्त करने के लिए कमांड लाइन से चला सकता हूं, बिना किसी अतिरिक्त पैकेज को स्थापित किए? (या अगर मैं करता हूं, तो कुछ सुपर-मिनिमल । )

बस का उपयोग करें base64 से कार्यक्रम coreutils पैकेज:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

या, न्यूलाइन चरित्र को शामिल करने के लिए

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

आउटपुट (न्यूलाइन शामिल है):

Aladdin:open sesame

ओपनएसएसएल बेस 64 को एन्कोड और डीकोड भी कर सकता है

$ openssl enc -base64 <<< 'Hello, World!'SGVsbG8sIFdvcmxkIQo=$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=Hello, World!

संपादित करें: एक उदाहरण जहां बेस 64 एन्कोडेड स्ट्रिंग कई लाइनों पर समाप्त होती है:

$ openssl enc -base64 <<< 'And if the data is a bit longer, the base64 encoded data will span multiple lines.'QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=$ openssl enc -base64 -d << EOF> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=> EOFAnd if the data is a bit longer, the base64 encoded data will span multiple lines.

यहाँ तुम जाओ!

निम्नलिखित को अपने नीचे जोड़ें ~/.bashrc फ़ाइल:

decode () {  echo "$1" | base64 -d ; echo}

अब, एक नया टर्मिनल खोलें और कमांड चलाएं ।

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

यह वही करेगा जो आपने अपने प्रश्न में पूछा था ।

आपकी मूल निर्भरता के साथ आपकी मूल स्क्रिप्ट में मामूली संशोधन के साथ ऐसा करना संभव है:

echo $1 | python -m base64 -d

यदि आप फ़ाइल नाम पास नहीं करते हैं, तो वह पायथन मॉड्यूल मानक इनपुट से पढ़ता है । इसमें पहले पैरामीटर को पाइप करने के लिए आप उपयोग कर सकते हैं echo $1 |.

मैंने बेस 64 कमांड लाइन में टिप्पणी की http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. इसलिए मैं ओपनएसएसएल बेस 64 डिकोडिंग का उपयोग करते समय एक चेतावनी जारी करता हूं :

 openssl base64 -e <<< 'Welcome to openssl wiki' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kKopenssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'Welcome to openssl wiki

चेतावनी बेस 64 लाइन की लंबाई ओपनएसएसएल में डिफ़ॉल्ट रूप से 64 वर्णों तक सीमित है :

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line that splits...' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo YXQgc3BsaXRzLi4uCg==openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

>= कुछ नहीं !

लाइन फ़ीड के बिना बेस 64 लाइन को डीकोड करने में सक्षम होने के लिए जो 64 वर्णों से अधिक का उपयोग करता है-एक विकल्प :

openssl base64 -d -A <<<'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='Welcome to openssl wiki with a very long line that splits...

यह वास्तव में विभाजित बेस 64 परिणाम के लिए 64 वर्णों की रेखाओं के बाद से बेहतर है-एक विकल्प छोटी गाड़ी है ( लंबी फ़ाइलों के साथ सीमा) ।

का उपयोग करना perl

perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

या साथ ही python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

बस इसे करने का एक और तरीका जोड़ने के लिए:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'

मैं इस पर बाल खींच के कुछ क्षणों था क्योंकि base64 लिनक्स उपकरण और भी openssl वास्तव में डिकोड कर सकते हैं । लेकिन मेरे पास यह विशेष बेस 64 एन्कोडेड फ़ाइल है जो थोड़ा गलत मान को डीकोड करती है । कुछ बाइट्स मेल खाते हैं, लेकिन फिर यह उपस्थिति है EF BF BD EF BF BD जब मैं देखता हूं hexedit दर्शक। और फिर सही ढंग से डिकोड किए गए अपेक्षित आउटपुट की तुलना में बाइट्स का अगला क्रम फिर से मेल खाता है । बाइट्स के इन अजीब अनुक्रम को इन-बीच में डाला गया, कभी-कभी EF BF BD केवल।

मामले को हल करने के लिए, मुझे यह देखना होगा कि जावा प्रेषक इसे कैसे एन्कोड करता है और फिर मैंने एक छोटा जावा बेस 64 डिकोडर बनाया । और अब मैं अपेक्षित मूल्य को डिकोड कर सकता हूं ।

यहाँ छोटा स्निपेट है जो इसे करता है: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52

अच्छा सवाल। और आपके संकेत के लिए धन्यवाद, अब मुझे पता है कि पायथन-एम बेस 64-एच आसान हो सकता है ।