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

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

Hasta ahora he probado un simple archivo bash que contiene python -m base64 -d $1 pero este comando espera un nombre de archivo, no 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.)

Solo usa el base64 programa de la coreutils paquete:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

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

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

salida (incluye nueva línea):

Aladdin:open sesame

openssl también puede codificar y decodificar base64

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

EDITAR: Un ejemplo en el que 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.'QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=$ openssl enc -base64 -d << EOF> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=> EOFAnd if the data is a bit longer, the base64 encoded data will span multiple lines.

Aquí tienes!

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

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

Ahora, abra una nueva terminal y ejecute el comando.

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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

Con sus dependencias originales, es posible hacer esto con una modificación menor de su script original:

echo $1 | 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 en él, puede usar echo $1 |.

Comenté la línea de comandos base64 en http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities. Así que emito una advertencia cuando uso la decodificación openssl base64 :

 openssl base64 -e <<< 'Welcome to openssl wiki' V2VsY29tZSB0byBvcGVuc3NsIHdpa2kKopenssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'Welcome to openssl wiki

advertencia la 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=='

>= NADA !

para poder decodificar una línea base64 sin avance de línea que exceda los 64 caracteres, use la opción-A :

openssl base64 -d -A <<<'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='Welcome to openssl wiki with a very long line that splits...

De todos modos, es mejor dividir el resultado base64 en líneas de 64 caracteres, ya que la opción-A tiene errores ( límite con archivos largos ).

Utilizar perl

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

O lo mismo con python

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

Solo para agregar otra forma de hacerlo:

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

Tuve unos momentos de tirones de pelo en este porque el base64 Herramienta de Linux y también el openssl puede decodificar, de hecho. Pero tengo este archivo codificado en base64 en particular que se decodifica a un valor ligeramente incorrecto. Los pocos bytes coinciden, pero luego está esta presencia de EF BF BD EF BF BD cuando veo en hexedit espectador. Y luego la siguiente secuencia de bytes coincide de nuevo cuando se compara con la salida esperada decodificada correctamente. Esta extraña secuencia de bytes se insertó en los intermedios, en algún momento como EF BF BD solo.

Para resolver el asunto, tengo que ver cómo lo codifica el remitente de Java y luego creé un pequeño decodificador java base64. Y ahora puedo decodificar al valor esperado.

Aquí está el pequeño fragmento que lo hace: https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52

Buena pregunta. Y gracias por tu sugerencia, ahora sé que python-m base64-h puede ser útil.