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.)

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

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.

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.


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 |.


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).


4

Za pomocą perl

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

Lub to samo z python

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

2

Aby dodać inny sposób:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.