¿Cómo codificar base64 a través de la línea de comando?

217

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

Josh
fuente
55
Tenga en cuenta que aunque la sintaxis de codificación de base64 es consistente de un sistema operativo a otro, la sintaxis de decodificación de base64 es base64 -do base64 -Ddepende de su sistema operativo. Usos de OSX -D.
Chris Johnson
@ChrisJohnson Si se usa en concierto con opensslla bandera para decodificar es -den OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Respuestas:

231

opensslpuede hacer esto por usted, y todo está instalado con OS X por defecto; no es necesario instalar darwinports.

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

Sin la -inopción lee de stdin

Steve Folly
fuente
79
Use openssl base64 < path/to/file.png | tr -d '\n' | pbcopyo cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopypara omitir la escritura en un archivo y simplemente copie la salida codificada en base64 al portapapeles sin los saltos de línea.
Mathias Bynens
3
Y usa una -dbandera para decodificar.
kenny
55
En mac, Para base64 codificar una cadena: openssl base64 -e <<< ramy para decodificar:openssl base64 -d <<< cmFtCg==
Ram Patra
8
@ Mathias si no quieres nuevas líneas openssl base64 [-e] -Ahace eso. + @kenny en decodificar si la entrada no tiene nueva línea cada 76 caracteres como máximo, incluido el caso sin líneas nuevas que acabo de decir, necesita -d -Ao obtendrá datos faltantes o corruptos sin mensaje de error (aunque hay un informe de error pendiente que puede resultar en una solución a eso).
dave_thompson_085
2
@Ram, en openssl base64 -e <<< ramrealidad codifica 4 bytes, incluyendo un avance de línea final; ver hexdump <<< ram.
Arjan
93

Openssl se puede usar de manera más sucinta:

echo -n 'input' | openssl base64

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

o

openssl base64 <ENTER> [type input] <CTRL+D>
Cañada
fuente
10
Sin embargo, la solución "echo" agrega un carácter LF (avance de línea) al final de la cadena de entrada. Mejor uso: echo -n 'input'
SuperTempel
8
E incluso un poco más sucintoopenssl base64 <<< input
Garrett Fogerlie
2
O simplemente usar base64sin openssl. De cualquier manera, necesito presionar Ctrl + D dos veces. Y tenga cuidado, @Garret: en Bash, con o sin openssl, openssl base64 <<< superusery ceda openssl base64 <<< "superuser" erróneamentec3VwZXJ1c2VyCg== , ya que la "cadena de aquí" aún incluye un avance de línea. ( Aparentemente no solo en Bash, sino también en zsh, ksh y yash. Ver hexdump <<< superuser. El resultado de Base64 debería 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 -nse prefiere si no necesita la nueva línea. Ciertamente es algo a tener en cuenta.
Steve Folly
2
Podrías usar printfen lugar deecho -n
Jason S
50

Intenta usar:

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

Debería estar disponible por defecto en OS X.

Derreck Dean
fuente
1
Agregue --decodepara revertir el proceso de base64 a normal.
luckydonald
1
Esto es mejor para la codificación de SVG porque crea una línea. Esto es más limpio que la salida de openssl base64. ¡Gracias!
Shanimal
32

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

Se puede utilizar base64 <<< stringy base64 -D <<< stringpara codificar y decodificar una cadena en el terminal, o base64 -in filey base64 -D -in filepara codificar y descodificar un archivo.

WKPlus
fuente
¿Tienes un ejemplo? Me sale Invalid characer in input streamcuando uso <<<... He intentado con ", 'y nada alrededor de la cadena.
Jonas
@Jonas ¿En qué caparazón estás? Puedes usar esto en bash y zsh.
WKPlus
Ah, no importa, ¡funciona!
Jonas
8

Dado que Python se proporciona con OS X de forma predeterminada, puede usarlo de la siguiente manera:

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

O instalar a coreutilstravés de Brew ( brew install coreutils) que proporcionará el base64comando:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
kenorb
fuente
6

En macOS siempre uso:

echo -n "STRING" | base64

-n es para evitar un nuevo carácter de línea al final de la línea.

patrickS
fuente
5

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 importa reutilizar el código en tantas otras plataformas de stock similares a UNIX como sea posible). Sin embargo, tenga cuidado porque no todas las variantes de UNIX admiten el modificador -m (iirc AIX sí, HP / UX sí, Solaris no).

$ 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 de STDIN:

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

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

openssl base64 -in [filename] | pbcopy

Steve
fuente
golf:base64 < [filename] | pbcopy
toteles
3

Pitón

Python viene preinstalado en todos los Mac hoy en día.

En Terminal ejecutar python(o ipython ).

Codificar un archivo:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)

Decodifica un archivo:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)

Por supuesto, ambas operaciones se pueden convertir en una línea, pero de esta manera es más legible.

OpenSSL

## 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 -out/ -output... filenamese imprimirá en stdout.

base64

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
ccpizza
fuente
2
uuencode -m [-o output_file] [file] name

Donde nombre es el nombre que se 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
usuario214207
fuente
uuencodeno es la codificación comobase64
ccpizza
2

Por alguna razón, echo -n <data> | openssl base64agregué una nueva línea en el medio de mis datos de base64. Supongo que fue porque mis datos de base64 eran realmente largos.

Usar echo -n <data> | base64para codificar y echo -n <base64-ed data> | base64 -Ddecodificar funcionó bien.

Heath Borders
fuente
nb: en mi nix, tuve que usar -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword
mlo55
2

Además de la respuesta anterior de Steve Folly, al encriptar en modo estándar, para evitar pasar nuevas líneas adicionales, presione CTRL + D dos veces para finalizar la entrada sin nuevas líneas adicionales. La salida se mostrará justo después de la misma línea.

Por ejemplo:

$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$

Alternativamente, puede usar printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
bigT
fuente
1

Hay Perl más MIME :: Base64:

perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'

Esto viene preinstalado. Puede especificar archivos separados en la línea de comando (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 hace una copia de seguridad de archivo1 en archivo1.txt, y escribe la salida codificada en Base-64 sobre el archivo original.

Jonathan Leffler
fuente
1

Una versión simple de NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
mauvm
fuente
No creo que esta sea una mejor respuesta ya que openssl(y ahora base64) viene con el sistema operativo.
Josh
A riesgo de dividir los pelos, y soy consciente de que esta crítica se aplica también a algunas de las otras respuestas, la pregunta es cómo codificar un archivo o un stdin . Si no me equivoco, su respuesta solo muestra cómo codificar una cadena.
G-Man
1

recod debería hacer el truco para ti

recode ../b64 < file.txt > file.b64

recode está disponible para OS X a través de MacPorts .

pesado
fuente
¿No hay nada incorporado?
Josh
@Josh - hay - openssl
Steve Folly
MacPorts no viene con ninguna distribución de OS X. Hay muchas otras opciones que sí. Por ejemplo solo base64comando.
Jason S
1

Si está base64 codificando un archivo de fuente, puede hacer esto:

base64 my-webfont.ttf > my-webfont.b64.ttf.txt

Lo uso en una Mac (10.10) todo el tiempo.

Nota : No habrá saltos de línea.

Chuck Ugwuh
fuente
1

Soluciones multiplataforma

Compilamos una lista de comandos de shell multiplataforma para codificar un archivo como base64. Los siguientes comandos toman un archivo de entrada (nombrado deploy.keyen ejemplos) y lo convierten a base64 sin ningún ajuste de nueva línea. La salida base64 se imprime en el 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, agregue > base64-encoded.txt(usando el nombre de archivo que elija).

Estos comandos fueron prototipados como parte de esta solicitud de extracción donde queríamos que los comandos de shell multiplataforma codificaran una clave privada SSH para eliminar las nuevas líneas.

Daniel Himmelstein
fuente