2010-11-06 5 views

ответ

64

Один из лучших примеров практического использования именованного канала ...

От http://en.wikipedia.org/wiki/Netcat

Еще одно полезное поведение использует Netcat в качестве прокси-сервера. Оба порта и хоста могут быть перенаправлены. Посмотрите на этом примере:

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

порт 12345 представляет собой запрос Это запускает сервер на пс порта 12345 и все соединения попадают в google.com:80. Если веб-браузер делает запрос на nc, запрос будет отправлен в Google, но ответ не будет отправлен в веб-браузер. Это потому, что трубы однонаправлены. Это можно обойти с помощью именованного канала для перенаправления ввода и вывода.

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

Прокси-сервер, реализованный с однострочным оболочкой. Никто не сказал, что unix может это сделать *. –

+3

Ну ... я думаю, это на самом деле двухстрочный ... – hft

+3

@hft Как насчет 'mkfifo backpipe; nc -l 12345 0 <обратная труба | nc www.google.com 80 1> backpipe'? – Levi

18

Вот команды:

$ mkfifo named_pipe 

$ echo "Hi" > named_pipe & 

$ cat named_pipe 

Первая команда создает трубу.

Вторая команда записывает в трубу (блокирование). & помещает это в фоновый режим, поэтому вы можете продолжать вводить команды в одной и той же оболочке. Он выйдет, когда FIFO будет опустошен следующей командой.

Последняя команда считывает из трубы.

+7

Я бы изменил # на $, поэтому его не все прокомментировали (и не запускались как root!) – alternative

+1

Это просто показать, что это приглашение оболочки! – Khaled

+3

Обычно «#» относится к корневому запросу (т. Е. Приглашению в корневой оболочке). Здесь нет ничего, что требовало бы запуска в корневой оболочке. – thomasrutter

21

Открыть две разные оболочки и оставить их рядом. В обоих случаях, перейдите в каталог/TMP/каталог

cd /tmp/ 

В первом одного типа:

mkfifo myPipe 
echo "IPC_example_between_two_shells">myPipe 

Во второй, тип:

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

Первая оболочка не даст вы все запросите назад, пока не выполните вторую часть кода во второй оболочке. Это потому, что чтение и запись fifo блокируют.

Вы также можете посмотреть тип FIFO, выполнив ls -al myPipe и просмотреть сведения об этом конкретном типе файла.

Следующим шагом было бы ввести код в скрипт! - Надеюсь, поможет.

+0

Можно ли делать блокирующие записи в fifo? – dabicho

Смежные вопросы