2010-11-06 18 views

Respuesta

64

Uno de los mejores ejemplos de un uso práctico de una tubería con nombre ...

De http://en.wikipedia.org/wiki/Netcat

Otro comportamiento útil es usar netcat como un proxy. Ambos puertos y hosts pueden ser redirigidos. Mira este ejemplo:

nc -l 12345 | nc www.google.com 80 

puerto 12345 representa la solicitud Así se inicia un servidor de Carolina del Norte en el puerto 12345 y todas las conexiones redirecciona a google.com:80. Si un navegador web realiza una solicitud a nc, la solicitud se enviará a google pero la respuesta no se enviará al navegador web. Eso es porque las tuberías son unidireccionales. Esto se puede solucionar con una tubería con nombre para redirigir la entrada y la salida.

mkfifo backpipe 
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe 
+31

Un proxy implementado con un shell de una línea. Nadie me dijo que Unix podía hacer * esto *. –

+3

Bueno ... supongo que es en realidad un juego de dos líneas ... – hft

+3

@hft ¿Qué tal 'backkit de' mkfifo; nc -l 12345 0 backpipe'? – Levi

18

Éstos son los comandos:

$ mkfifo named_pipe 

$ echo "Hi" > named_pipe & 

$ cat named_pipe 

El primer comando crea la tubería.

El segundo comando se escribe en la tubería (bloqueo). El & pone esto en segundo plano para que pueda continuar escribiendo comandos en el mismo shell. Saldrá cuando el siguiente comando vacíe el FIFO.

El último comando se lee de la tubería.

+7

Cambiaría el # a $ por lo que no está todo comentado (¡y no se ejecuta como root!) – alternative

+1

¡Solo para mostrar que se trata de un intérprete de comandos de shell! – Khaled

+3

Es habitual que "#" haga referencia a un aviso raíz (es decir, un mensaje en un shell raíz). No hay nada aquí que requiera ejecutarse en un shell raíz. – thomasrutter

21

Abra dos cubiertas diferentes y déjelas una al lado de la otra. En ambos, ir al directorio/tmp/

cd /tmp/ 

En el primero un tipo:

mkfifo myPipe 
echo "IPC_example_between_two_shells">myPipe 

En la segunda, tipo:

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe 

primera carcasa no dará le devuelve la respuesta hasta que ejecute la segunda parte del código en el segundo intérprete de comandos. Es porque la lectura y la escritura fifo son bloqueantes.

También puede echar un vistazo al tipo FIFO haciendo un ls -al myPipe y ver los detalles de este tipo específico de archivo.

¡El siguiente paso sería embarcar el código en un script! - Espero eso ayude.

+0

¿Es posible realizar escrituras sin bloqueo en el fifo? – dabicho

Cuestiones relacionadas