En corto
Sin scp/sftp, convierte el binario a texto ASCII, pásalo por la terminal y recupéralo:
| |
Verifica siempre con un hash en ambos lados (sha256sum archivo.bin). Si no coincide, el pegado perdió bytes.
Para qué sirve
A veces solo tienes una shell: una sesión Telnet a un equipo viejo, una consola serie, un ssh a una jaula sin scp, un contenedor mínimo sin herramientas de red, o un KVM/IPMI donde solo puedes teclear. No hay transferencia de archivos, pero sí puedes escribir y leer texto.
El truco: cualquier archivo —incluso binario— se puede representar como texto ASCII imprimible. Lo codificas en el origen, copias el texto por la terminal, y lo decodificas en el destino. Dos herramientas hacen esto: base64 (moderna, en todas partes) y uuencode (clásica, de los tiempos de UUCP y Usenet).
Opción 1: base64 (recomendada)
base64 viene en coreutils, así que está en prácticamente cualquier Linux/BSD/macOS moderno.
En el origen — codifica y muestra el texto:
| |
Para un archivo grande, mándalo a un .txt y ábrelo, o imprime en una sola línea sin saltos:
| |
Copia toda la salida (es texto imprimible, seguro de pegar).
En el destino — pega el texto y decodifica:
| |
Ctrl-D marca fin de entrada (EOF) y base64 -d escribe el binario reconstruido.
En macOS/BSD el flag para una sola línea no es
-w0. Usabase64 -i archivo.binpara codificar ybase64 -D(D mayúscula) para decodificar. Si dudas,base64 --help.
Opción 2: uuencode / uudecode (clásica)
uuencode/uudecode vienen en el paquete sharutils. Es lo que se usaba para mandar binarios por correo y Usenet antes de MIME. Útil si estás en un sistema viejo que ya lo trae y no tiene base64.
| |
En el origen — el segundo argumento es el nombre que tendrá el archivo al decodificar:
| |
Imprime un bloque que empieza con begin 644 archivo.bin y termina en end. Copia todo, incluidas esas dos líneas.
En el destino — pega el bloque y decodifica:
| |
uudecode lee el nombre del propio bloque (begin 644 archivo.bin) y crea archivo.bin solo. No necesitas indicar el nombre de salida.
Verifica SIEMPRE con un hash
Pegar texto largo en una terminal es frágil: un buffer que se corta, un carácter perdido, un wrap que mete un espacio. Comprueba que el archivo llegó íntegro:
| |
Si los hashes no coinciden, el pegado se corrompió. Repite, o parte el archivo (abajo).
Comprime antes de codificar
base64 agranda el archivo ~33%. Si lo comprimes primero, hay menos texto que pegar — y de paso empacas una carpeta entera en un solo archivo. Comprime, codifica, y del otro lado inviertes el orden: decodifica, descomprime.
Un archivo con gzip (o bzip2 / xz, mejor ratio y más lentos):
| |
Una carpeta entera con tar (empaca + comprime + codifica):
| |
Verifica con sha256sum el tar.gz (no el contenido suelto) en ambos lados: es más fácil comparar un solo archivo que una carpeta.
Archivos grandes: pártelos
Pegar megabytes de texto en una terminal es pedir problemas. Si tras comprimir sigue grande, divide antes de codificar:
| |
Qué hace cada pieza
| Comando | Qué hace |
|---|---|
base64 archivo | Binario → texto ASCII (líneas de 76 chars por defecto) |
base64 -w0 archivo | Igual, pero una sola línea (GNU); útil para pegar de un tirón |
base64 -d | Texto base64 → binario (lee de stdin hasta EOF) |
uuencode in out | Binario → bloque begin…end; out = nombre al decodificar |
uudecode | Bloque begin…end → archivo (toma el nombre del bloque) |
gzip -c / -d | Comprime / descomprime a stdout (también bzip2, xz) |
tar czf - dir/ | Empaca y comprime una carpeta hacia stdout (z=gzip, j=bzip2, J=xz) |
tar xzf - | Extrae una carpeta desde stdin |
split -b | Parte un archivo en trozos de tamaño fijo |
sha256sum | Hash para verificar integridad de punta a punta |
Traps
- Siempre verifica con hash. Es el único seguro contra un pegado truncado. Sin esto, crees que copiaste y tienes basura.
- El tamaño crece ~33–35%. base64 agrega ~33%, uuencode ~35%. Un binario de 3 MB son ~4 MB de texto que teclear/pegar. Para eso está
split. - Flags distintos en macOS/BSD vs GNU.
-w0/-dson GNU; en macOS es-i/-D. No asumas. - Cuidado con el auto-wrap del cliente de terminal. Algunos clientes Telnet/serie insertan saltos o cortan líneas largas. Si falla, usa base64 con wrap (sin
-w0) y bloques más chicos. - Telnet va en claro. Si pasas algo sensible por Telnet, va sin cifrar por la red. Úsalo solo en consolas locales/serie o redes de confianza; para todo lo demás, SSH.
- No es para TB. Esto es para rescatar un archivo cuando no hay otra vía, no para mover volúmenes. Si puedes usar
scp/rsync/sftp, úsalos.