Jak mogę zdekodować ciąg base64 z wiersza poleceń?

426

Chciałbym napisać skrypt bash, aby zdekodować ciąg base64. Na przykład piszę, decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==a drukuje Aladdin:open sesamei wraca do monitu.

Do tej pory próbowałem prostego pliku bash zawierającego, python -m base64 -d $1ale to polecenie oczekuje, że nazwa pliku nie jest łańcuchem. Czy istnieje inne nieinteraktywne polecenie (niekoniecznie w module Python), które mogę uruchomić z wiersza poleceń, aby to osiągnąć, bez konieczności instalowania dodatkowych pakietów? (Lub jeśli to zrobię, coś bardzo minimalnego.)

david.libremone
źródło

Odpowiedzi:

630

Wystarczy użyć base64programu z coreutilspakietu:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Lub, aby dołączyć znak nowej linii

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

wyjście (zawiera nowy wiersz):

Aladdin:open sesame
styczeń
źródło
10
Lub: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 - kod i echo
Greg Chabala
61
Lub:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk
4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtW systemie Windows z base64 gita.
Pożar
3
@ Stycznia Nie jest tak Just use, ponieważ wiele osób wie o base64programie - ale ponieważ nie można po prostu wstawić ciągu jako opcji wiersza poleceń, trudno jest uzyskać odpowiednią składnię dla użytkowników, którzy dotykają CLI tylko raz na jakiś czas.
feeela
12
Na komputerze Mac skopiuj zakodowany ciąg do schowka i uruchom pbpaste | base64 --decode.
Marián Černý,
95

openssl może również kodować i dekodować base64

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

EDYCJA: Przykład, w którym ciąg zakodowany w base64 kończy się na wielu liniach:

$ 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
źródło
8
Dzięki odpowiedzi Philippe'a musisz dodać -A dla długich łańcuchów base64, w przeciwnym razie openssl nic nie zwróci, patrz askubuntu.com/a/271676/305568
morloch
@morloch lub po prostu unikaj usuwania nowych wierszy z danych zakodowanych w standardzie base64 i działa zgodnie z oczekiwaniami ...
geirha
1
Nie uważam coreutilsto „dodatkowy” pakiet zawierający programy takie jak ls, mkdir, cp, mv, i chmod. Wątpię, czy możesz zrobić cokolwiek pożytecznego z urządzeniem bez tego.
vidstige
@vidstige, to prawda. Nie wiem, dlaczego miałem wrażenie, że base64 nie został zainstalowany domyślnie; tak nie jest.
geirha
1
Chociaż jest to wymiana stosu ubuntu, używanie opensslma przewagę nad standardem base64pracy w Git Bash w systemie Windows, przynajmniej starszą wersję 1.8.1 Git Bash, którą zainstalowałem.
willkil
38

Proszę bardzo!

Dodaj następujące elementy na dole ~/.bashrcpliku:

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

Teraz otwórz nowy Terminal i uruchom polecenie.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

To zrobi dokładnie to, o co prosiłeś w swoim pytaniu.

SirCharlo
źródło
20

W przypadku oryginalnych zależności można to zrobić z niewielką modyfikacją oryginalnego skryptu:

echo $1 | python -m base64 -d

Jeśli nie podasz nazwy pliku, moduł Pythona odczytuje ze standardowego wejścia. Aby przesłać do niego pierwszy parametr, możesz użyć echo $1 |.

AmanicA
źródło
1
Także: python -m base32 nazwa pliku
kenorb
1
to nie działa :), ale używaj metod .b32 *
rzr
13

Skomentowałem wiersz poleceń base64 w http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Dlatego używam ostrzeżenia podczas korzystania z dekodowania openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

ostrzeżenie base64 długość linii jest domyślnie ograniczona do 64 znaków w openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

=> NIC!

aby móc dekodować linię base64 bez wysuwu linii przekraczającą 64 znaki, użyj opcji -A:

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

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

Tak czy inaczej lepiej jest faktycznie podzielić wynik base64 na 64 znaki, ponieważ -A opcja to BŁĄD (limit przy długich plikach).

philippe lhardy
źródło
4

Za pomocą perl

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

Lub to samo z python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
AB
źródło
2

Aby dodać inny sposób:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
erjoalgo
źródło