Pregunta Cómo codificar base64 a través de la línea de comandos?


¿Hay un comando de terminal en Mac OS X que codificará base64 un archivo o stdin?


155


origen


Tenga en cuenta que, aunque la sintaxis que codifica base64 es consistente de un sistema operativo a otro, la sintaxis de decodificación base64 es cualquiera base64 -d o base64 -D dependiendo de tu sistema operativo OSX usa -D. - Chris Johnson
@ChrisJohnson Si se usa en concierto con openssl la bandera para decodificar es -d en OS X (10.10 Yosemite). - ᴠɪɴᴄᴇɴᴛ


Respuestas:


openssl puede hacer esto por usted, y todo está instalado con OS X de forma predeterminada; no es necesario instalar darwinports.

$ openssl base64 -in <infile> -out <outfile>

Sin el -in la opción lee de stdin


175



Utilizar openssl base64 < path/to/file.png | tr -d '\n' | pbcopy o cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy omitir la escritura en un archivo y simplemente copiar la salida codificada en base64 al portapapeles sin los saltos de línea. - Mathias Bynens
Y usa un -d bandera para decodificar. - kenny
En mac, para base64 codificar una cadena: openssl base64 -e <<< ram y decodificar: openssl base64 -d <<< cmFtCg== - Ram Patra
@mathias si no quieres nuevas líneas openssl base64 [-e] -A hace eso. + @kenny en la decodificación si la entrada no tiene línea nueva cada 76 caracteres como máximo, incluido el caso de no-líneas nuevas que acabo de indicar, necesita -d -A o obtendrá datos perdidos o dañados sin mensaje de error (aunque hay un informe de error pendiente que puede dar como resultado una solución a eso). - dave_thompson_085
@RAM, openssl base64 -e <<< ram en realidad codifica 4 bytes, incluido un avance de línea posterior; ver hexdump <<< ram. - Arjan


Openssl se puede usar de manera más sucinta:

echo -n 'input' | openssl base64

[echo -n -> se debe usar, o la codificación se realizará incluyendo el nuevo carácter de línea]

o

openssl base64 <ENTER> [type input] <CTRL+D>

60



Sin embargo, la solución "eco" agrega un carácter LF (avance de línea) al final de la cadena de entrada. Mejor uso: echo -n 'input' - SuperTempel
E incluso un poco más conciso openssl base64 <<< input - Garrett Fogerlie
O simplemente usa base64 sin openssl. De cualquier manera, necesito presionar Ctrl + D dos veces. Y ten cuidado, @Garret: en Bash, con o sin openssl, openssl base64 <<< superuser y openssl base64 <<< "superuser"  erróneamente rendimiento c3VwZXJ1c2VyCg==, ya que la "cadena aquí" sigue incluyendo un avance de línea. (Aparentemente no solo en Bash, sino también en zsh, ksh y yash. Ver hexdump <<< superuser. El resultado Base64 debe ser c3VwZXJ1c2Vy.) - Arjan
@Arjan, dudaría en usar la palabra "erróneamente", como usted señaló, la cadena aquí incluye un avance de línea, pero por una buena razón, unix.stackexchange.com/questions/20157/... . echo -n es preferible si no necesita la nueva línea. Ciertamente es algo de lo que debes estar consciente. - Steve Folly
Podrías usar printf en lugar de echo -n - Jason S


Intenta usar:

base64 -i <in-file> -o <outfile>

Debería estar disponible por defecto en OS X.


31



Estupendo. simple y elegante. ¡Gracias! - Leon li


base64 el comando está disponible por defecto en mi OS X 10.9.4.

Puedes usar base64 <<< string y base64 -D <<< string para codificar y decodificar una cadena en el terminal, o base64 -in file y base64 -D -in file para codificar y decodificar un archivo.


21



¿Tienes un ejemplo? yo obtengo Invalid characer in input stream cuando usas <<<... lo he intentado con ", ' y nada alrededor de la cadena. - Jonas
@Jonas ¿En qué capa estás? Puedes usar esto en bash y zsh. - WKPlus
Ah, no importa, ¡funciona! - Jonas


En términos de velocidad, usaría openssl seguido de perl, seguido de uuencode. En términos de portabilidad, usaría uuencode seguido de Perl seguido de openssl (si le interesa reutilizar el código en tantas otras plataformas de stock de UNIX como sea posible). Sin embargo, tenga cuidado porque no todas las variantes de UNIX admiten el modificador -m (iirc AIX lo hace, HP / UX lo hace, Solaris no lo hace).

$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real    0m0.025s

$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real    0m0.051s

$  time openssl base64 -in out.jpg -out filename.b64 
real    0m0.017s

Use el modificador -m para uuencode file_in.txt por base64 como se especifica en RFC1521 y escríbalo en filename.b64 (con filename_when_uudecoded.txt como el nombre de archivo predeterminado cuando se decodifica):

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt

Ejemplo STDIN:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt

5





Como Python cuenta con OS X de manera predeterminada, puede usarlo de la siguiente manera:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO

O instala coreutils vía Elaborar cerveza (brew install coreutils) que proporcionará base64 mando:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO

5





También puede canalizarlo directamente al portapapeles (al menos en mac):

openssl base64 -in [filename] | pbcopy


4



golfing: base64 < [filename] | pbcopy - totels