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

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

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

438
задан 2 August 2015 в 12:03

8 ответов

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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Или, для включения символа новой строки

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

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

Aladdin:open sesame
630
ответ дан 2 August 2015 в 12:03

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.
95
ответ дан 2 August 2015 в 12:03

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

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

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

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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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

38
ответ дан 2 August 2015 в 12:03

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

echo $1 | python -m base64 -d

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

20
ответ дан 2 August 2015 в 12:03

Я сделал командную строку комментария 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 опция БАГГИ (предел с длинными файлами).

13
ответ дан 2 August 2015 в 12:03

Только добавить другой способ сделать это:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
2
ответ дан 2 August 2015 в 12:03

Используя perl

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

Или то же с python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
4
ответ дан 2 August 2015 в 12:03

У меня было несколько моментов, когда меня дергали за волосы, потому что инструмент base64 Linux, а также openssl действительно могут декодировать. Но у меня есть этот конкретный файл с кодировкой base64, который декодирует немного неправильное значение. Несколько байтов совпадают, но затем появляется EF BF BD EF BF BD, когда я просматриваю в hexedit средстве просмотра. И затем следующая последовательность байтов снова совпадает при сравнении с правильно декодированным ожидаемым результатом. Эта странная последовательность байтов была вставлена ​​между ними, когда-то только как EF BF BD.

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

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

0
ответ дан 23 October 2020 в 13:10

Другие вопросы по тегам:

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