Как я могу декодировать строку base64 из командной строки?

Я хотел бы написать скрипт bash для декодирования строки base64. Например, я набираю decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== и он печатает Aladdin:open sesame и возвращается к подсказке.

До сих пор я пробовал простой файл bash, содержащий python -m base64 -d $1 но эта команда ожидает имя файла, а не строку. Есть ли другая неинтерактивная команда (не обязательно в модуле Python), которую я могу запустить из командной строки для достижения этой цели без необходимости установки каких-либо дополнительных пакетов? (Или, если я это сделаю, что-нибудь супер-минимальное.)

Просто используйте base64 программа из coreutils пакет:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Или включить символ новой строки

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

вывод (включает новую строку):

Aladdin:open sesame

openssl также может кодировать и декодировать base64

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

РЕДАКТИРОВАТЬ: Пример, в котором строка в кодировке base64 заканчивается несколькими строками:

$ 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

Если вы не передаете имя файла, этот модуль python считывает данные из стандартного ввода. Чтобы передать в него первый параметр, вы можете использовать echo $1 |.

Я прокомментировал командную строку base64 в http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Поэтому я выдаю предупреждение при использовании декодирования openssl base64 :

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

предупреждение длина строки base64 по умолчанию в openssl ограничена 64 символами :

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

>= НИЧЕГО !

чтобы иметь возможность декодировать строку base64 без перевода строки, которая превышает 64 символа, используйте опцию -A :

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

В любом случае лучше фактически разделить результат base64 на 64 символьные строки, так как опция -A ГЛЮЧИТ (ограничение для длинных файлов).

С помощью 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 Инструмент Linux, а также openssl действительно, может расшифровывать. Но у меня есть этот конкретный файл в кодировке base64, который декодируется с немного неправильным значением. Несколько байтов действительно совпадают, но тогда есть это присутствие EF BF BD EF BF BD когда я смотрю в hexedit зритель. И затем следующая последовательность байтов снова совпадает при сравнении с правильно декодированным ожидаемым результатом. Эти странные последовательности байтов были вставлены в промежуточные, когда-то как EF BF BD только.

Чтобы решить этот вопрос, я должен посмотреть, как отправитель Java кодирует его, а затем я создал небольшой декодер java base64. И теперь я могу расшифровать ожидаемое значение.

Вот небольшой фрагмент, который это делает: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52

Хороший вопрос. И спасибо за ваш намек, теперь я знаю, что python -m base64 -h может пригодиться.