Domanda Come posso decodificare una stringa base64 dalla riga di comando?


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

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


319
2017-08-21 12:17


origine




risposte:


Basta usare il base64 programma dal coreutils pacchetto:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

Oppure, per includere il carattere di nuova riga

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

output (include newline):

Aladdin:open sesame

483
2017-08-21 13:34



Oppure: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo - Greg Chabala
O: base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ== - jmk
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt Su Windows con git's base64. - Fire
@ Gennaio non lo è Just use, perché molte persone conoscono il base64 programma - ma come non si può appena 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
Su Mac, copia la stringa codificata negli appunti ed esegui pbpaste | base64 --decode. - Marián Černý


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.

75
2017-08-21 22:23



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 semplicemente evitare di rimuovere la nuova riga dai dati codificati base64, e funziona come previsto ... - geirha
Non prenderei in considerazione coreutils un pacchetto "aggiuntivo" contenente programmi come ls, mkdir, cp, mv, e chmod. Dubito che tu possa fare qualcosa di utile con la tua macchina senza di essa. - vidstige
@vidstige, è vero. Non so perché ho avuto l'impressione che base64 non fosse installato di default; questo non è assolutamente il caso. - geirha
Mentre questo è lo scambio di stack ubuntu, usando openssl ha il vantaggio rispetto allo standard base64 di lavorare su Git Bash su Windows, almeno la versione precedente di Git Bash 1.8.1 che ho installato. - willkil


Ecco qui!

Aggiungi il seguente alla fine del tuo ~/.bashrc file:

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.


32
2017-08-21 13:39





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

echo $1 | python -m base64 -d

Se non si passa un nome file, quel modulo python legge dallo standard input. Per inserire il primo parametro in esso è possibile utilizzare echo $1 |.


18
2017-10-05 12:15



Inoltre: python -m nomefile base32 - kenorb
questo non funziona :) ma usa i metodi .b32 * - rzr


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

avvertimento la lunghezza della linea base64 è limitata a 64 caratteri per impostazione predefinita in openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

=> NIENTE!

per poter decodificare una linea base64 senza alimentazione di riga che superi 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 il risultato effettivo di base64 suddiviso in righe di 64 caratteri poiché l'opzione -A è BUGGY (limite con file lunghi).


12
2018-03-23 18:23



@Seth per favore ripristinare i blocchi correttamente, il comando edit openssl con i miei commenti interleaved. - philippe lhardy
Puoi aggiustarlo? Non posso distinguere tra i due ... ci proverò, ma potresti aver bisogno di darmi una mano ;-) - Seth♦
beh, devo solo dare un'occhiata wiki.opensslfoundation.com/... dove sono riuscito a usare meglio la sintassi wiki (cerca bas64 in questa pagina). - philippe lhardy


utilizzando perl

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

O lo stesso con python

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

4
2017-07-02 20:22





Solo per aggiungere un altro modo per farlo:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'

2
2018-06-15 06:27