¿Cómo puedo decodificar una cadena base64 desde la línea de comando?

317

Me gustaría escribir un script bash para decodificar una cadena base64. Por ejemplo, escribo decode QWxhZGRpbjpvcGVuIHNlc2FtZQ== e imprime Aladdin:open sesame y vuelve al prompt.

Hasta ahora he probado un archivo bash simple que contiene python -m base64 -d pero este comando espera que un nombre de archivo no sea una cadena. ¿Hay otro comando no interactivo (no necesariamente en un módulo de Python) que pueda ejecutar desde la línea de comandos para lograr esto, sin tener que instalar ningún paquete adicional? (O si lo hago, algo súper mínimo).

    
pregunta d3vid 21.08.2012 - 14:17

7 respuestas

477

Solo usa el programa base64 del paquete coreutils :

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

O, para incluir el carácter de nueva línea

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

salida (incluye nueva línea):

Aladdin:open sesame
    
respondido por el January 21.08.2012 - 15:34
74

openssl también puede codificar y decodificar base64

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

EDITAR: Un ejemplo donde la cadena codificada en base64 termina en varias líneas:

$ 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.
    
respondido por el geirha 22.08.2012 - 00:23
32

¡Aquí tienes!

Agregue lo siguiente al final de su archivo ~/.bashrc :

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

Ahora, abra una nueva Terminal y ejecute el comando.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Esto hará exactamente lo que pidió en su pregunta.

    
respondido por el SirCharlo 21.08.2012 - 15:39
18

Con sus dependencias originales, es posible hacer esto con una pequeña modificación en su script original:

echo  | python -m base64 -d

Si no pasa un nombre de archivo, ese módulo de python lee de la entrada estándar. Para canalizar el primer parámetro, puede usar echo | .

    
respondido por el AmanicA 05.10.2012 - 14:15
12

Comenté la línea de comandos de base64 en enlace . Entonces, publico una advertencia cuando uso la decodificación de openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

advertencia longitud de línea base64 está limitada a 64 caracteres de forma predeterminada en openssl :

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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

= & gt; ¡NADA!

para poder decodificar una línea base64 sin alimentación de línea que supere los 64 caracteres use una opción -A:

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

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

Esto de todos modos es mejor dividir en realidad el resultado de base64 en 64 líneas de caracteres, ya que una opción es ERROR (límite con archivos largos).

    
respondido por el philippe lhardy 23.03.2013 - 19:23
4

Usar perl

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

O lo mismo con python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
    
respondido por el A.B. 02.07.2015 - 22:22
2

Solo para agregar otra forma de hacerlo:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
    
respondido por el erjoalgo 15.06.2016 - 08:27

Lea otras preguntas en las etiquetas