Respaldo usando Netcat

miércoles, marzo 12, 2008

Hace unos días me trajeron una máquina con Windows XP instalado sobre una partición NTFS. "Aparentemente" la partición estaba dañada, daba uno de esos famosos pantallazos azules y no cargaba por ninguno de los medios más conocidos para bootear particiones de Windows. Intenté incluso colocando el disco en otra máquina con Windows XP y booteando para al lo menos extraer la información y hacer el respaldo. Pero lamentablemente todo los intentos transcurrieron sin éxito alguno.

Bueno, como no soy partidario de Windows, decidí bootear la máquina usando un live-cd de Knoppix a ver que pasaba. Al primer intento no cargó la partición correctamente, reinicié y como al 3 intento cargo la partición sin problema alguno. BINGO! Ya podía leer los archivos y hacer el respaldo... Oh wait! Eran aproximadamente 6.1GB de información, solo tenía un pen drive de 512MB y la pc tenía quemador de cds pero allí estaba cargado el cd de Knoppix... Una situación díficil. He escuchado por ahí que se puede sacar el live-cd de Knoppix para usar la unidad en otras cosas pero nunca lo he probado ni tenía el tiempo para ponerme a investigar al respecto. El cronometro marchaba sin vuelta atrás.

En ese momento dije: "Sería bueno poder pasar esta toda información para otra máquina a través de la red..." y f
ue entonces cuando recordé el viejo Netcat. Para enviar archivos de una pc a otra se debe ejecutar el comando nc en ambas máquinas. Primero en la máquina que contiene la data a transmitir (servidor) y luego en la que recibirá la data (cliente).

Abri una consola en la máquina que actuaría como servidor y escribí lo siguiente:

$ tar -c - ruta_de_la_carpeta_a_copiar | nc -w 10 -p 5667 -l

Es una sola línea de código pero muy poderosa. Primero le decimos al comando tar que nos genere un archivo .tar de la carpeta ruta_de_la_carpeta_a_copiar (puede ser más de una carpeta si es necesario). La salida del comando tar no irá a ningún archivo, sino que la pasaremos al comando nc usando pipeline. Luego al comando nc le decimos que espere 10 segundos antes de realizar la conexión (-w 10), que use el puerto 5667 (-p 5667) y por último que se ponga a la espera de conexiones entrantes (-l).

Ahora del lado del cliente:

$ nc direccion_ip_del_servidor 5667 > nombre_del_archivo.tar

Aquí, se le indica al comando nc que intente conectarse al host cuya dirección es direccion_ip_del_servidor a través del puerto 5667 y que la data entrante sea volcada sobre el archivo nombre_del_archivo.tar

Para mejorar un poco la visualización de progreso en la transferencia se puede usar el comando pv. El comando en el cliente sería algo como:

$ nc direccion_ip_del_servidor 5667 | pv -b > nombre_del_archivo.tar
Eso nos da un pequeño aviso en la consola del cliente sobre la cantidad de datos que han sido transferidos .

Con ese par de comandos salvé la noche y puede guardar los datos para respaldarlos luego. Espero que también pueda servirles a ustedes en algún momento. Saludos