Experimentos con netcat y grep

¿qué sentido tiene esto?
Pruebas realizadas con netcat, 3 consolas, grep y tee

PRIMERA PRUEBA:

en la primera consola

nc -lk 7878

en la segunda consola

nc -lk 7879|nc localhost 7878

en una tercera consola

nc localhost 7879

Se manda el texto: "¿hola, que tal?" por la tercera consola.
Se muestra dicho mensaje en la primera consola y no en la segunda-> OK

SEGUNDA PRUEBA:

en la segunda consola

echo -e "hola\n adios" > fich;cat fich|grep hola|nc localhost 7878

Se muestra "hola" en la primera consola, pero no "adios". Luego el grep está filtrando correctamente antes de pasar la llamada al nc vía pipe.

TERCERA PRUEBA:

en la segunda consola
nc -lk 7879|grep hola|nc localhost 7878

en la tercera consola
cat fichi|nc localhost 7879

No aparece nada en la primera ni en la segunda consola al mandar el texto.

CUARTA PRUEBA; trazas con tee

en la segunda consola
nc -lk 7879|tee traza1|grep hola|tee traza2|nc localhost 7878

en la tercera consola
cat fichi|nc localhost 7879

No aparece nada en la primera ni en la segunda consola.

en una cuarta consola
cat traza1
"hola
adios"
cat traza2
no se muestra nada

QUINTA PRUEBA

en la segunda consola
cat fichi|tee traza1|grep hola|tee traza2|nc localhost 7878

en la primera consola aparece "hola"

con cat traza1 aparece "hola adios"
con cat traza2 aparece "hola"

¿Por qué no funciona el caso 3 al introducir el grep si los demás casos funcionan correctamente? ¿qué estoy pasando por alto?

Hola jsa_

Según lo tienes puesto no funciona porque creas el fichero como "fich" y luego intentas acceder a el como "fichi", aunque supongo que no será ese el problema xD

Debería funcionar, te pongo un ejemplo:

Consola 1:

nc -l -p 7878

Consola 2:

nc -l -p 7879 | grep hola | nc -vv 127.0.0.1 7878

Consola 3:

echo -e "hola\n adios" > fich ; cat fich | nc -vv 127.0.0.1 7879

Ejecuta los comandos en orden y luego detenlos (control+C) en orden inverso, es decir, de la consola 3 a la 1, Verás que en la primera consola se muestra hola.

Espero haberte ayudado
Saludos

Sí, me ha ayudado lo que me has comentado del CTRL C. Lo del fichero es una errata.

De todas formas no termino de entender porque cuando se mete un grep por medio hay que hacer CTRL C para que se visualicen los cambios en la consola 1 y sin el grep esto no es necesario. De hecho, no es necesario cuando hay un grep y sólo dos consolas.

Gracias por tu comentario

Hola de nuevo jsa_

A ver, si te fijas en la consola 1 lo que hacemos es poner el NetCat a la escucha por el puerto 7878 y en la 2 por el 7879, una vez hecho esto por la consola 3 nos conectamos a la 2 mandándole el contenido del archivo de texto.

Para que vale el "|"?? pues lo que hace es que la salida de un comando (en este caso el nc de la consola 2) en vez de ir a para a la consola valla a para a la entrada de otro comando (el grep), como detrás del grep hay otro "|" el nc de detrás de este "|" tendrá como entrada la salida de grep, en vez de mostrarse esta salida en la consola.
Así pues el nc de la consola 2 mandará al de la consola 1 "hola".

Por que hay que pulsar control+c? es decir, por que hay que para el nc? por que grep recibe como entrada la salida del comando, por ello tiene que esperar a que el comando (nc) deje de ejecutarse.

Por ejemplo, ejecuta el comando:

# iwlist wlan0 scan

Verás que tarda un poco en escanear todas las redes wifi, ahora prueba con esto:

# iwlist wlan0 scan | grep ESSID

Verás que también tarda un poco, es decir, el "|" espera a que el comando se ejecute totalmente para recoger su salida y redirigirla al grep, si esto no pasase no se mostrarían todas las redes, como puedes ver a continuación:

# "iwlist wlan0 scan &" | grep ESSID

El "&" obliga a que el terminal no se bloque hasta que se termine de ejecutar el comando, por lo que gre no recibe nada.

Espero que ahora si lo hallas entendido.
Saludos