Jak mohu dekódovat řetězec base64 z příkazového řádku?

326

Chtěl bych napsat skript bash pro dekódování řetězce base64. Zadejte napříkladdecode QWxhZGRpbjpvcGVuIHNlc2FtZQ== a vytiskneAladdin:open sesame a vrátí se k výzvě.

Zatím jsem vyzkoušel jednoduchý bash soubor obsahujícípython -m base64 -d , ale tento příkaz očekává, že název souboru nebude řetězec. Existuje další neinteraktivní příkaz (ne nutně v modulu Python), který můžu spustit z příkazového řádku, abych to dosáhl, aniž by musel instalovat žádné další balíčky? (Nebo pokud ano, něco super-minimálního.)

    
dané d3vid 21.08.2012 14:17

7 odpovědí

489

Použijte programbase64 z balíčkucoreutils:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Nebo pro zahrnutí nového řádku

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

výstup (obsahuje nový řádek):

Aladdin:open sesame
    
odpověděl January 21.08.2012 15:34
75

Openssl může také zakódovat a dekódovat base64

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!

EDIT: Příklad, kde zakódovaný řetězec base64 skončí na více řádcích:

$ 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.
    
odpověděl geirha 22.08.2012 00:23
32

Zde jdete!

Přidejte do dolní části vašeho souboru~/.bashrc následující:

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

Nyní otevřete nový terminál a spusťte příkaz.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Uděláte přesně to, co jste požadovali ve své otázce.

    
odpověděl SirCharlo 21.08.2012 15:39
18

S vašimi původními závislostmi je to možné s menší úpravou původního skriptu:

echo  | python -m base64 -d

Pokud nepředáte jméno souboru, tento pythonový modul přečte ze standardního vstupu. Pro vložení prvního parametru do něj můžete použítecho |.

    
odpověděl AmanicA 05.10.2012 14:15
12

Komentoval jsem příkazový řádek base64 v Odkazu . Proto při vydání openssl base64 dekódování vydám varování:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

varování Délka řádku base64 je ve výchozím nastavení v openssl omezena na 64 znaků:

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

= > NIKDY!

Aby bylo možné dekódovat linii base64 bez linky, které přesahuje 64 znaků, použijte volbu -A:

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

Welcome to openssl wiki with a very long line that splits...

Je to lepší způsob, jak skutečně rozdělit base64 výsledek v 64 znakových řádcích od -A možnost je BUGGY (limit s dlouhými soubory).

    
odpověděl philippe lhardy 23.03.2013 19:23
4

Použitíperl

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

Nebo to samé spython

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
    
odpověděl A.B. 02.07.2015 22:22
2

Stačí přidat další způsob, jak to udělat:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
    
odpověděl erjoalgo 15.06.2016 08:27