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

426

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

Hasta ahora he intentado un archivo bash simple que contiene python -m base64 -d $1pero 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).

david.libremone
fuente

Respuestas:

630

Simplemente use el base64programa del coreutilspaquete:

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
enero
fuente
10
O: echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
Greg Chabala
61
O:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk
44
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txtEn Windows con git's base64.
Fuego
3
@Enero No lo es Just use, porque muchas personas conocen el base64programa, pero como uno no puede simplemente insertar una cadena como opción de línea de comando, es difícil obtener la sintaxis correcta para los usuarios que tocan la CLI solo de vez en cuando.
feeela
12
En Mac, copie la cadena codificada en el portapapeles y ejecútela pbpaste | base64 --decode.
Marián Černý
95

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.
geirha
fuente
8
Gracias a la respuesta de Philippe, debe agregar -A para cadenas base64 largas; de lo contrario, openssl no devolverá nada, consulte askubuntu.com/a/271676/305568
morloch
@morloch o simplemente evite eliminar las nuevas líneas de los datos codificados en base64, y funciona como se espera ...
geirha
1
No consideraría coreutilsun paquete "adicional" que contiene programas como ls, mkdir, cp, mv, y chmod. Dudo que pueda hacer algo útil con su máquina sin ella.
vidstige
@vidstige, eso es cierto. No sé por qué tenía la impresión de que base64 no estaba instalado por defecto; ese no es totalmente el caso.
geirha
1
Si bien este es el intercambio de la pila de ubuntu, el uso openssltiene la ventaja sobre el estándar base64de trabajar en Git Bash en Windows, al menos la versión anterior 1.8.1 Git Bash que he instalado.
willkil
38

¡Aqui tienes!

Agregue lo siguiente al final de su ~/.bashrcarchivo:

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.

SirCharlo
fuente
20

Con sus dependencias originales, es posible hacer esto con una modificación menor a 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 puede usarlo echo $1 |.

AmanicA
fuente
1
También: python -m base32 filename
kenorb
1
esto no funciona :) pero use métodos .b32 *
rzr
13

Comenté la línea de comando base64 en http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities . Entonces, emito una Advertencia cuando uso la decodificación openssl base64:

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

la longitud de la línea base64 de advertencia está limitada a 64 caracteres por defecto 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 salto 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, esto es mejor para dividir realmente el resultado de base64 en líneas de 64 caracteres ya que -Una opción es BUGGY (límite con archivos largos).

philippe lhardy
fuente
4

Utilizando perl

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

O lo mismo con python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
AB
fuente
2

Solo para agregar otra forma de hacerlo:

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