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

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

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

307 голосов | спросил d3vid 21 PM00000040000004731 2012, 16:17:47

7 ответов


468

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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode

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

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

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

Aladdin: open sesame
ответил January 21 PM00000050000005431 2012, 17:34:54
74

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

$ openssl enc -base64 <<<'Привет мир!'
SGVsbG8sIFdvcmxkIQo =
$ openssl enc -base64 -d <<SGVsbG8sIFdvcmxkIQo =
Привет мир!

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

$ openssl enc -base64 <<<«И если данные немного дольше, данные, закодированные в base64, будут охватывать несколько строк».
QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo =
$ openssl enc -base64 -d <<EOF
> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo =
> EOF
И если данные немного дольше, данные, закодированные в base64, будут охватывать несколько строк.
ответил geirha 22 AM00000020000001831 2012, 02:23:18
32

Здесь вы идете!

Добавьте в нижнюю часть вашего файла ~ .bashrc следующее:

decode () {
  эхо "$ 1" | base64 -d; эхо
}

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

декодировать QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

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

ответил SirCharlo 21 PM00000050000004331 2012, 17:39:43
18

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

echo $ 1 | python -m base64 -d

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

ответил AmanicA 5 +04002012-10-05T16:15:11+04:00312012bEurope/MoscowFri, 05 Oct 2012 16:15:11 +0400 2012, 16:15:11
12

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

openssl base64 -e <<<'Добро пожаловать в вики-портал openssl'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Добро пожаловать в wiki

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

openssl base64 -e <<<'Добро пожаловать в вики opensl с очень длинной строкой
 что расщепляется ... "

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg ==

openssl base64 -d <'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg =='

= > НИЧЕГО!

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

openssl base64 -d -A <<
'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg =='

Добро пожаловать в вики opensl с очень длинной строкой, которая разбивается ...

Это в любом случае лучше, чем фактический раскол base64 приводит к 64-символьным строкам, поскольку параметр -A является BUGGY (ограничение длинными файлами).

ответил philippe lhardy 23 MarpmSat, 23 Mar 2013 22:23:06 +04002013-03-23T22:23:06+04:0010 2013, 22:23:06
4

Использование perl

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

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

python -m base64 -d <<"QWxhZGRpbjpvcGVuIHNlc2FtZQ =="
ответил A.B. 2 J000000Thursday15 2015, 23:22:37
2

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

emacs -Q --batch -eval '(princ (base64-encode-string (read-string ":")))'
ответил erjoalgo 15 J0000006Europe/Moscow 2016, 09:27:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132