Cuando dos personas se quieren mandar uno o varios ficheros entre dos máquinas linux/unix-like lo primero que uno piensa es en usar scp o sftp… En el mejor de los casos tengo que desplazarme a su máquina picar mi password en su teclado, o que venga quien sea y hacerlo al revés. ¿Qué pasa si ni siquiera hay SSH? ¿ usamos Samba ? ¿ ftp ? … ¡Mucho más fácil! usamos netcat.

Este es uno de los trucos más tontos que he encontrado nunca, y desde entonces cada vez que quiero pasar algo con alguien le digo escribe «netcat $#@!#%», da igual las veces que lo usen que casi nunca se acuerdan de los comandos. Así que este post va especialmente dirigido, con todo el cariño del mundo, a todos los que saben que existe netcat pero no se acuerda cómo se usa. Y si eres nuevo al netcateo, bienvenido 😀

Breve descripción: netcat es un «cat» por red, se usa igual que se usa un cat solo que con ip’s y puertos, y permite enviar un flujo de datos por red de un punto a otro. Como todo en esta vida de cliente-servidor, uno escucha y el otro se conecta aunque eso no determina quién envía a quién.

El que escucha:

 netcat -l -p 6969 

El que se conecta:

 netcat ip_del_amigo 6969

6969 es el puerto, tanto el que escucha como el que recibe tienen que estar de acuerdo en eso (obviamente), y la ip_del_amigo es, la «ip del amigo» :). El que vaya a escuchar siempre tiene que escribir primero el comando, esto hará que se quede esperando que el otro haga la conexión.

Ahora enviaremos algo, y escribo las dos opciones que en el fondo hacen lo mismo mandar algo del ordenador (A) -> (B).

Primera opción (A) escucha (B) se conecta.
1º en el ordenador (A)

 tar -cvzf - lista_de_ficheros_a_mandar | nc -l -p 6969 

2º en el ordenador (B)

 nc ip_de_A 6969 | tar -xvzf - 

Segunda opción (B) escucha (A) se conecta (pero la información sigue yendo de A -> B):
1º en el ordenador (B)

 nc -l -p 6969 | tar -xvzf - 

2º en el ordenador (A)

 tar -cvzf - lista_de_ficheros_a_mandar | nc ip_de_B 6969 

¡¡y ya esta!!

PD: Esta configuración de NetCat y tar hace que se quede esperando con la conexión establecida aun cuando ha terminado de enviar, para evitarlo puedes añadir la opción -q 1 a los dos netcats (envía y recibe) lo que hace que se cierre la conexión sola. También puedes pulsar «control-C» para acabar. El problema es que el «-q 1» no es estandar de todos los netcats.

PD(2): También hay netcat para windows 🙂