Escrituras al vuelo con SSH

Comandos Linux 27 de abr. de 2026

El problema de dobles escrituras


Vamos a plantear un escenario para ver el problema y conseguir una solución correcta que optimice tiempos y recursos.

Supongamos que hay un servidor en el que hay que extraer unos datos, generar un log especial o incluso un dump de memoria para depurar algo de ese servidor.

Puede ser que esos ficheros generados ocupen bastante o que incluso haya que llevarlos a otro sitio desde el que procesarlos o analizarlos, al que llamaremos destino

La primera idea que se nos puede ocurrir es crear los ficheros en el servidor y luego copiarlos al destino sin embargo esto no es una buena idea ya que hay varias cosas que nos van a ralentizar:

  • Hay que esperar a que terminen de generarse los ficheros para luego copiar.
  • Cuando se copian los ficheros se crea I/O de lectura local y de escritura en el destino.
  • Estamos escribiendo 2 veces: la primera e local y la segunda en el destino.

El problema de los montajes y las latencias


Quizás la siguiente opción que podamos valorar es escribir en un recurso del servidor destino usando algun recursos compartido o algun tipo de montaje.

De nuevo tenemos un problema y es que los recursos compartidos (Samba/CIFS) o el montar un recurso remoto (nfs, sshfs) tienen una latencia.
Además de que necesitamos instalar y configurar un servicio, asegurarndonos de que está bien configurado.

Tunel SSH: una solución simple


Si nos vamos a llevar los ficheros a un equipo, podemos hacerlo mediante scp (copia sobre ssh), pero tenemos otra opción que es crear un tunel ssh y la transferencia se realiza en modo raw y ocupando el ancho de banda disponible de nuestra conexión.

La idea es que el servidor abre una conexión directa via SSH con el destino y en este servidor con los datos en crudo que le llegan los escribimos en un fichero.

Para la escritura de lo recibido por el tunel ssh, el servidor destino usará el comando dd para crear los ficheros finales.

comando (stdout) → túnel SSH → dd → fichero final en destino
Esquema del proceso de creacion de fichero mediante tunel ssh

a. Sintaxis básica:

comando | ssh usuario@destino "ssh of=/ruta/fichero"

La salida estandar ó stdout de la ejecución del comando se mete en una tubería (pipe) y mediante ssh lo llevamos al servidor destino. Allí mediante el programa dd lo escribimos mediante el parametro of al fichero de destino que queremos.

b. Sintaxis mejorada:

comando | ssh -o Compression=no usuario@destino "ssh of=/ruta/fichero bs=8M status=progress"

Ejemplo sencillo:

cat fichero.zip | ssh -o Compression=no usuario@destino "ssh of=/tmp/fichero.zip bs=8M status=progress"

Lo que estamos haciendo es lo siguiente:
Volcamos el contenido de fichero.zip a la pantalla (stdout) pero con el pipe lo capturamos y lo enviamos con ssh al servidor destino, en el servidor destino se ejecut el comando que tenemos entre comillas. En el comando dd indicamos la ruta y nombre del fichero a escribir y ademas incluimos el parámetro bs para volcar y escribir los bloques recibidos de 8 en 8 Mb, y además con status vemos el progreso y tiempos de escritura.

Este proceso se realiza facilmente para cualquier comando que pueda sacar a "pantalla" su ejecución o usar un parámetro que permita redirigir a pantalla su salida.

Programas sin uso de stdout

Hay programas que por su construcción no tienen la opción de sacar su salida por pantalla y solo permiten escribir a un fichero.

Por suerte en Linux todo se maneja como ficheros y podemos hacer que todo termine en donde deseemos.

En nuestro caso hay un fichero especial en el sistema: /proc/self/fd/1 que es la salidad estandard que usaremos si nos solicitan el nombre de fichero.

Prueba el siguiente comando en tu equipo GNU/Linux para comprobar que funciona:

echo "Escribiendo en la pantalla" > /proc/self/fd/1

Verás que se muestra el mensaje directamente en pantalla.

El comando que necesites ejecutar y que no pueda escribir en pantalla habría que indicarle que use como fichero /proc/self/fd/1 para que funcione el tunel ssh.

Sistema de ficheros virtual

Para este truco es utiliza el sistema de archivos virtual /proc que apunta a los ficheros actules en ejecución self y a los descriptores de ficheros.
Los descriptores de ficheros disponibles son el 0, 1 y 2 y se corresponden con los que use tu terminal o terminal virtual actual.

  • /proc/self/fd/0 Entrada estándar ó stdin
  • /proc/self/fd/1 Salida estándar o stdout
  • /proc/self/fd/2 Salida de error ó stderr

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux