Come posso decodificare una stringa base64 dalla riga di comando?


426

Vorrei scrivere uno script bash per decodificare una stringa base64. Ad esempio decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==, scrivo Aladdin:open sesamee stampa e ritorna al prompt.

Finora ho provato un semplice file bash contenente python -m base64 -d $1ma questo comando prevede un nome file non una stringa. Esiste un altro comando non interattivo (non necessariamente in un modulo Python) che posso eseguire dalla riga di comando per raggiungere questo obiettivo, senza dover installare pacchetti aggiuntivi? (O se lo faccio, qualcosa di super minimal.)

Risposte:


630

Basta usare il base64programma dal coreutilspacchetto:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Oppure, per includere il carattere di nuova riga

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

output (include newline):

Aladdin:open sesame

10
Oppure: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
Greg Chabala

61
Oppure:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk

4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtSu Windows con git's base64.
Fuoco

3
@Gennaio Non lo è Just use, perché molte persone conoscono il base64programma, ma poiché non si può semplicemente inserire una stringa come opzione della riga di comando, è difficile ottenere la sintassi giusta per gli utenti che toccano la CLI solo una volta ogni tanto.
feeela,

12
Su Mac, copia la stringa codificata negli appunti ed esegui pbpaste | base64 --decode.
Marián Černý,

95

openssl può anche codificare e decodificare base64

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

EDIT: un esempio in cui la stringa codificata base64 finisce su più righe:

$ 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
Grazie alla risposta di Philippe, è necessario aggiungere -A per stringhe base64 lunghe, altrimenti openssl non restituirà nulla, vedere askubuntu.com/a/271676/305568
morloch,

@morloch o evita semplicemente di rimuovere le nuove righe dai dati codificati in base64 e funziona come previsto ...
geirha,

1
Non prenderei in considerazione coreutilsun pacchetto "aggiuntivo" che contiene programmi come ls, mkdir, cp, mv, e chmod. Dubito che tu possa fare qualsiasi cosa utile con la tua macchina senza di essa.
Vidstige,

@vidstige, è vero. Non so perché avevo l'impressione che base64 non fosse installato di default; non è assolutamente così.
geirha,

1
Mentre questo è lo scambio di stack di Ubuntu, l'utilizzo opensslha il vantaggio rispetto allo standard base64di lavorare in Git Bash su Windows, almeno la versione 1.8.1 Git Bash che ho installato.
willkil,

38

Ecco qui!

Aggiungi quanto segue in fondo al tuo ~/.bashrcfile:

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

Ora, apri un nuovo Terminale ed esegui il comando.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Questo farà esattamente quello che hai chiesto nella tua domanda.


20

Con le tue dipendenze originali è possibile farlo con una piccola modifica allo script originale:

echo $1 | python -m base64 -d

Se non si passa un nome file, quel modulo Python legge dall'input standard. Per reindirizzare il primo parametro in esso è possibile utilizzare echo $1 |.


1
Inoltre: python -m base32 nomefile
kenorb

1
questo non funziona :) ma usa i metodi .b32 *
rzr

13

Ho commentato la riga di comando base64 in http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Quindi emetto un avviso quando si utilizza la decodifica openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

attenzione la lunghezza della linea base64 è limitata a 64 caratteri di default in openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

=> NIENTE!

per essere in grado di decodificare una riga base64 senza avanzamento di riga che supera i 64 caratteri utilizzare l'opzione -A:

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

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

Questo è comunque meglio per dividere effettivamente il risultato base64 in righe di 64 caratteri poiché -Un'opzione è BUGGY (limite con file lunghi).


4

utilizzando perl

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

O lo stesso con python

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

2

Solo per aggiungere un altro modo per farlo:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.