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

330

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

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

    
задан d3vid 21.08.2012 в 12:17
источник

7 ответов

498

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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

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

echo 'echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode'

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

Aladdin:open sesame
    
ответ дан January 21.08.2012 в 13:34
источник
76

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.
    
ответ дан geirha 21.08.2012 в 22:23
32

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

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

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

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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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

    
ответ дан SirCharlo 21.08.2012 в 13:39
19

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

echo $1 | python -m base64 -d

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

    
ответ дан AmanicA 05.10.2012 в 12:15
12

Я прокомментировал командную строку base64 в ссылке . Поэтому я выпускаю предупреждение при использовании opensl base64-декодирования:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

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

    
ответ дан philippe lhardy 23.03.2013 в 18:23
4

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

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

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

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
    
ответ дан A.B. 02.07.2015 в 20:22
2

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

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
    
ответ дан erjoalgo 15.06.2016 в 06:27