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


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

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


320
2017-08-21 12:17


происхождения




ответы:


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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

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

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

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

Aladdin:open sesame

484
2017-08-21 13:34



Или: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
Или: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt В Windows с базовым процессором git64. - Fire
@Январь Это не Just use, потому что многие люди знают о base64 программы, но как нельзя просто вставьте строку как параметр командной строки, трудно получить синтаксис для пользователей, которые касаются CLI только один раз в то время. - feeela
На Mac скопируйте закодированную строку в буфер обмена и запустите pbpaste | base64 --decode, - Marián Černý


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

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

EDIT: пример, где строка с кодировкой base64 заканчивается на нескольких строках:

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

75
2017-08-21 22:23



Благодаря ответу Филиппа вам нужно добавить -A для длинных строк base64, иначе openssl ничего не вернет, см. askubuntu.com/a/271676/305568 - morloch
@morloch или просто не удаляйте новые строки из кодированных данных base64, и он работает как ожидается ... - geirha
Я бы не подумал coreutils «дополнительный» пакет, содержащий такие программы, как ls, mkdir, cp, mv, а также chmod, Я сомневаюсь, что вы можете сделать что-нибудь полезное с вашей машиной без него. - vidstige
@vidstige, это правда. Я не знаю, почему у меня создалось впечатление, что base64 не был установлен по умолчанию; это совсем не так. - geirha
Хотя это обмен стеками ubuntu, используя openssl имеет преимущество перед стандартными base64 работы в Git Bash на Windows, по крайней мере старая версия 1.8.1 Git Bash, которую я установил. - willkil


Ну вот!

Добавьте в нижнюю часть ~/.bashrc файл:

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

Теперь откройте новый терминал и запустите команду.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Это будет делать именно то, что вы просили в своем вопросе.


32
2017-08-21 13:39





С вашими исходными зависимостями это можно сделать с незначительной модификацией исходного скрипта:

echo $1 | python -m base64 -d

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


18
2017-10-05 12:15



Также: python -m base32 filename - kenorb
это не работает :) но используйте методы .b32 * - rzr


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

 openssl base64 -e <<< 'Welcome to openssl wiki'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

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

 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 является BUGGY (ограничение длинными файлами).


12
2018-03-23 18:23



@Seth, пожалуйста, скорректируйте блоки правильно, ваше редактирование объединяет команду openssl с моими чередующимися комментариями. - philippe lhardy
Ты можешь починить это? Я не могу различать эти два ... Я попробую, но вам, возможно, придется помочь мне ;-) - Seth♦
ну просто нужно взглянуть на wiki.opensslfoundation.com/... где мне удалось лучше использовать синтаксис wiki (поиск на этой странице в bas64). - philippe lhardy


С помощью perl

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

Или то же самое с python

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

4
2017-07-02 20:22





Просто добавьте еще один способ сделать это:

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

2
2018-06-15 06:27