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

426

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

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

david.libremone
источник

Ответы:

630

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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

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

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

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

Aladdin:open sesame
январь
источник
10
Или: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
Грег Чабала,
61
Или:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
JMK
4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtВ Windows с git base64.
Огонь
3
@ Январь Это не так Just use, потому что многие люди знают о base64программе, но так как нельзя просто вставить строку в качестве параметра командной строки, сложно получить правильный синтаксис для пользователей, которые время от времени касаются интерфейса командной строки.
Feeela
12
На Mac скопируйте закодированную строку в буфер обмена и запустите pbpaste | base64 --decode.
Мариан Черны
95

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.'
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.
geirha
источник
8
Благодаря ответу Филиппа вам нужно добавить -A для длинных строк base64, иначе openssl ничего не вернет, см. Askubuntu.com/a/271676/305568
morloch
@morloch или просто избегайте удаления новых строк из данных, закодированных в base64, и это работает как положено ...
geirha
1
Я бы не стал рассматривать coreutils«дополнительный» пакет , содержащий программы , такие как ls, mkdir, cp, mvи chmod. Я сомневаюсь, что вы можете сделать что-нибудь полезное с вашей машиной без нее.
vidstige
@vidtige, это правда. Я не знаю, почему у меня сложилось впечатление, что base64 не был установлен по умолчанию; это совсем не так.
гейра
1
Хотя это обмен стеками Ubuntu, использование opensslимеет преимущество перед стандартным base64режимом работы в Git Bash на Windows, по крайней мере, на более старой версии 1.8.1 Git Bash, которую я установил.
Willkil
38

Ну вот!

Добавьте следующее в конец вашего ~/.bashrcфайла:

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

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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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

SirCharlo
источник
20

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

echo $1 | python -m base64 -d

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

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

Я прокомментировал командную строку base64 в http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Поэтому я выдаю предупреждение при использовании декодирования openssl 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 (ограничение для длинных файлов).

Филипп Ларди
источник
4

С помощью perl

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

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

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
AB
источник
2

Просто чтобы добавить другой способ сделать это:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
erjoalgo
источник