Я хотел бы написать bash-скрипт для декодирования строки base64. Например, я набираю decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==
, и он печатает Aladdin:open sesame
и возвращается к приглашению.
До сих пор я пробовал простой bash-файл, содержащий python -m base64 -d $1
, но эта команда ожидает имя файла, а не строку. Есть ли другая неинтерактивная команда (не обязательно в модуле Python), которую я могу запустить из командной строки, чтобы добиться этого, без необходимости устанавливать какие-либо дополнительные пакеты? (Или, если я делаю, что-то супер-минимальное.)
Просто используйте base64
программа от coreutils
пакет:
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode
Или, для включения символа новой строки
echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`
вывод (включает новую строку):
Aladdin:open sesame
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.
Здесь Вы идете!
Добавляют следующее к нижней части Вашего ~/.bashrc
файл:
decode () {
echo "$1" | base64 -d ; echo
}
Теперь, откройте новый Терминал и выполните команду.
decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Это сделает точно, что Вы попросили в Вашем вопросе.
С Вашими исходными зависимостями возможно сделать это с незначительной модификацией к Вашему исходному сценарию:
echo $1 | python -m base64 -d
, Если Вы не передаете имя файла, тот модуль Python, чтения из стандарта вводят. Для передачи по каналу первого параметра в него, можно использовать echo $1 |
.
Я сделал командную строку комментария 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 опция БАГГИ (предел с длинными файлами).
Только добавить другой способ сделать это:
emacs -Q --batch -eval '(princ (base64-encode-string (read-string ": ")))'
Используя perl
perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
Или то же с python
python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
У меня было несколько моментов, когда меня дергали за волосы, потому что инструмент base64
Linux, а также openssl
действительно могут декодировать. Но у меня есть этот конкретный файл с кодировкой base64, который декодирует немного неправильное значение. Несколько байтов совпадают, но затем появляется EF BF BD EF BF BD
, когда я просматриваю в hexedit
средстве просмотра. И затем следующая последовательность байтов снова совпадает при сравнении с правильно декодированным ожидаемым результатом. Эта странная последовательность байтов была вставлена между ними, когда-то только как EF BF BD
.
Чтобы решить эту проблему, я должен посмотреть, как отправитель Java кодирует его, а затем я создал небольшой декодер java base64. И теперь я могу декодировать ожидаемое значение.
Вот небольшой фрагмент, который это делает: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52