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.
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]
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.
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.
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):
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
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.
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.
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:
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 .
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.
base64 -d
obase64 -D
depende de su sistema operativo. Usos de OSX-D
.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 por defecto; no es necesario instalar darwinports.Sin la
-in
opción lee de stdinfuente
openssl base64 < path/to/file.png | tr -d '\n' | pbcopy
ocat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy
para omitir la escritura en un archivo y simplemente copie la salida codificada en base64 al portapapeles sin los saltos de línea.-d
bandera para decodificar.openssl base64 -e <<< ram
y para decodificar:openssl base64 -d <<< cmFtCg==
openssl base64 [-e] -A
hace 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 -A
o 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).openssl base64 -e <<< ram
realidad codifica 4 bytes, incluyendo un avance de línea final; verhexdump <<< ram
.Openssl se puede usar de manera más sucinta:
[echo -n -> debe usarse, o la codificación se realizará incluyendo un nuevo carácter de línea]
o
fuente
openssl base64 <<< input
base64
sinopenssl
. De cualquier manera, necesito presionar Ctrl + D dos veces. Y tenga cuidado, @Garret: en Bash, con o sinopenssl
,openssl base64 <<< superuser
y cedaopenssl 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. Verhexdump <<< superuser
. El resultado de Base64 debería serc3VwZXJ1c2Vy
).echo -n
se prefiere si no necesita la nueva línea. Ciertamente es algo a tener en cuenta.printf
en lugar deecho -n
Intenta usar:
Debería estar disponible por defecto en OS X.
fuente
--decode
para revertir el proceso de base64 a normal.openssl base64
. ¡Gracias!base64
El comando está disponible por defecto en mi OS X 10.9.4.Se puede utilizar
base64 <<< string
ybase64 -D <<< string
para codificar y decodificar una cadena en el terminal, obase64 -in file
ybase64 -D -in file
para codificar y descodificar un archivo.fuente
Invalid characer in input stream
cuando uso<<<
... He intentado con"
,'
y nada alrededor de la cadena.Dado que Python se proporciona con OS X de forma predeterminada, puede usarlo de la siguiente manera:
O instalar a
coreutils
través de Brew (brew install coreutils
) que proporcionará elbase64
comando:fuente
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.
fuente
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).
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):
Ejemplo de STDIN:
fuente
También puede canalizarlo directamente al portapapeles (al menos en mac):
openssl base64 -in [filename] | pbcopy
fuente
base64 < [filename] | pbcopy
Pitón
Python viene preinstalado en todos los Mac hoy en día.
En Terminal ejecutar
python
(o ipython ).Codificar un archivo:
Decodifica un archivo:
Por supuesto, ambas operaciones se pueden convertir en una línea, pero de esta manera es más legible.
OpenSSL
Omitiendo
-out
/-output... filename
se imprimirá en stdout.base64
Otra utilidad ootb presente tanto en OSX como en Ubuntu:
fuente
Donde nombre es el nombre que se mostrará en el encabezado codificado.
Ejemplo:
o
fuente
uuencode
no es la codificación comobase64
Por alguna razón,
echo -n <data> | openssl base64
agregué 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> | base64
para codificar yecho -n <base64-ed data> | base64 -D
decodificar funcionó bien.fuente
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:
Alternativamente, puede usar
printf
:fuente
Hay Perl más MIME :: 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:
Esto hace una copia de seguridad de archivo1 en archivo1.txt, y escribe la salida codificada en Base-64 sobre el archivo original.
fuente
Una versión simple de NodeJS:
fuente
openssl
(y ahorabase64
) viene con el sistema operativo.recod debería hacer el truco para ti
recode está disponible para OS X a través de MacPorts .
fuente
base64
comando.Si está base64 codificando un archivo de fuente, puede hacer esto:
Lo uso en una Mac (10.10) todo el tiempo.
Nota : No habrá saltos de línea.
fuente
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.key
en 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.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.
fuente