¿Cómo codificar base64 a través de la línea de comandos?
¿Existe un comando de terminal en Mac OS X que codifique un archivo o stdin en base64?
¿Existe un comando de terminal en Mac OS X que codifique un archivo o stdin en base64?
openssl
puede hacer esto por ti, y está todo instalado con OS X por defecto; no hay necesidad de instalar darwinports.
$ openssl base64 -in <infile> -out <outfile>
Sin la opción -in
lee desde stdin
Intenta usar:
base64 -i <in-file> -o <outfile>
Debería estar disponible por defecto en OS X.
Dado que Python está provisto de OS X por defecto, puedes usarlo como se indica a continuación:
$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO
O instalar coreutils
vía Brew (brew install coreutils
) que proveerá el comando base64
:
$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
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 te preocupa reutilizar el código en tantas otras plataformas de stock como sea posible en UNIX). Pero ten cuidado porque no todas las variantes de UNIX soportan el switch -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
Usa el switch -m para el archivo uuencode_in. txt por base64 como se especifica en RFC1521 y escríbelo a nombre de archivo.b64 (con nombre de archivo_cuando_uudecoded.txt como nombre de archivo por defecto cuando se decodifica):
uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt
STDIN ejemplo:
cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
Python viene preinstalado en todos los macs de hoy en día.
En la Terminal ejecute python
(o ipython ).
Codifique un archivo:
base64data = open('myfile.jpg','rb').read().encode('base64')
open('myfile.txt','w').write(base64data)
Decodifique un archivo:
data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)
Por supuesto, ambas operaciones pueden ser convertidas en un oneliner pero de esta manera es más legible.
## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64
## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64
## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg
## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg
Omitiendo el -out
/-output... filename
se imprimirá a stdout.
Otra utilidad ootb presente tanto en OSX como en Ubuntu:
## encode to base64
base64 < myfile.jpg > myfile.jpg.b64
## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg
## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg
Por alguna razón, echo -n <data> | openssl base64
añadió una nueva línea en medio de mis datos de base64. Asumo que fue porque mis datos de base64 eran realmente largos.
Usar echo -n <data> | base64
para codificar y echo -n <base64-ed data> | base64 -D
para decodificar funcionó bien.
uuencode -m [-o output_file] [file] name
Donde nombre es el nombre a mostrar en el encabezado codificado.
Ejemplo:
cat docbook-xsl.css | uuencode -m docbook-xsl.css
o
uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css
Además de la respuesta de Steve Folly arriba, al cifrar en modo stdin, para evitar pasar nuevas líneas adicionales, presione CTRL+D dos veces para terminar la entrada sin ninguna línea adicional. La salida se mostrará justo después de la misma línea.
Por ejemplo:
$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$
Alternativamente, podrías usar printf
:
$ printf 'input' | openssl base64
aW5wdXQ=
$
Hay Perl más MIME::Base64:
perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'
Esto viene pre-instalado. Puede especificar archivos separados en la línea de comandos (o suministrar los datos en la entrada estándar); cada archivo está codificado por separado. También puedes hacer:
perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1
Esto respalda el archivo1 al archivo1.txt, y escribe la salida codificada en Base64 sobre el archivo original.
Si estás codificando un archivo de fuente en base64, puedes hacer esto:
base64 my-webfont.ttf > my-webfont.b64.ttf.txt
Uso esto en un Mac (10.10) todo el tiempo.
Nota : No habrá saltos de línea.
Compilamos una lista de comandos de shell multiplataforma para codificar un archivo como base64. Los siguientes comandos toman un archivo de entrada (llamado deploy.key
en los ejemplos) y lo convierten a base64 sin ninguna nueva línea de envoltura. La salida de base64 se imprime en la terminal a través de stdout.
# For systems with openssl
openssl base64 -A -in=deploy.key
# For systems with Python (2 or 3) installed
python -c "import base64; print(base64.standard_b64encode(open('deploy.key', 'rb').read()).decode())"
# For Windows or Linux systems that have the GNU coreutils base64 command
base64 --wrap=1000000 deploy.key
# For macOS systems
base64 --break=1000000 deploy.key
Para redirigir la salida a un archivo, añade > base64-encoded.txt
(usando un nombre de archivo de tu elección).
Estos comandos fueron prototipados como parte de esta solicitud pull donde queríamos que los comandos shell multiplataforma para base64 codificaran una clave privada SSH para eliminar las nuevas líneas.