Як я можу розшифрувати рядок base64 з командного рядка?


426

Я хотів би написати скрипт bash для розшифровки рядка base64. Наприклад, я набираю, decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==і він друкує Aladdin:open sesameта повертається до підказки.

Поки я спробував простий файл bash, що містить, python -m base64 -d $1але ця команда очікує, що ім'я файлу не є рядком. Чи є інша неінтерактивна команда (не обов'язково в модулі Python), яку я можу запустити з командного рядка, щоб досягти цього, без необхідності встановлювати додаткові пакети? (Або якщо я це роблю, щось супер мінімальне.)

Відповіді:


630

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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Або включити символ нового рядка

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

вихід (включає новий рядок):

Aladdin:open sesame

10
Або: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --декод && echo
Грег Чабала

61
Або:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk

4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtУ Windows з базою git64.
Пожежа

3
@January Це не так Just use, тому що багато людей знають про base64програму - але оскільки не можна просто вставити рядок як варіант командного рядка, важко отримати синтаксис правильно для користувачів, які торкаються CLI лише раз у раз.
гонорар

12
На Mac скопіюйте закодований рядок у буфер обміну та запустіть pbpaste | base64 --decode.
Marián Černý

95

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.

8
Завдяки відповіді Філіпа вам потрібно додати -A для довгих рядків base64, інакше openssl нічого не поверне, дивіться askubuntu.com/a/271676/305568
morloch

@morloch або просто уникайте видалення нових рядків з кодованих даних base64, і це працює як очікувалося ...
geirha

1
Я б не став розглядати coreutils«додатковий» пакет , що містить програми , такі як ls, mkdir, cp, mvі chmod. Я сумніваюся, що ви можете зробити що-небудь корисне зі своєю машиною без цього.
vidstige

@vidstige, це правда. Я не знаю, чому в мене склалося враження, що base64 не встановлений за замовчуванням; це зовсім не так.
geirha

1
Хоча це обмін стеками ubuntu, використання opensslмає перевагу над base64рівнем роботи в Git Bash для Windows, принаймні, старішою версією 1.8.1 Git Bash, яку я встановив.
willkil

38

Ось ви йдете!

Додайте до нижньої частини ~/.bashrcфайлу:

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

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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Це зробить саме те, про що ви просили у своєму запитанні.


20

За допомогою оригінальних залежностей це можна зробити за допомогою незначної модифікації вашого оригінального сценарію:

echo $1 | python -m base64 -d

Якщо ви не передаєте ім'я файлу, цей модуль python зчитується зі стандартного вводу. Для передачі в нього першого параметра можна використовувати echo $1 |.


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 символьні рядки, оскільки -а варіант - BUGGY (ліміт довгих файлів).


4

Використання perl

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

Або те саме з python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

2

Просто додайте ще один спосіб зробити це:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.