Как связать 2 удаленных процесса вместе через netcat и fifo? - PullRequest
1 голос
/ 11 января 2012

На HostA у меня есть процесс, procA, который выполняет ввод / вывод, например:

#!/bin/bash
while sleep 1 ; do
  # Consume input *if available*
  if read -t 0.5 x; then  # a timed-read
    # If input is available, output it.
    echo "HostA Input: $x"
  fi

  # Produce some output.
  echo "HostA Output: $(date)"
done

В HostB у меня очень похожий процесс, procB, с той лишь разницей, что procB помечает его ввод / вывод префиксом HostB (вместо префикса HostA).

Теперь я хочу использовать программу netcat (/usr/bin/nc) для отправки стандартного вывода procA на стандартный вывод procB и стандартного вывода procB на стандартный вывод procA. Во всем этом я ожидаю, что выходные данные HostA должны появиться на HostB, а выходные данные HostB должны появиться на HostA ... во многом так же, как в следующем каноническом nc примере однорангового чата:

[HostB]$ nc -l 4000

[HostA]$ nc HostB 4000

Но когда я попытался расширить приведенный выше канонический пример, заменив человека на обоих хостах процессами procA и procB следующим образом, он не работал :

Вкл. HostB :

$ mkfifo p
$ ./procB <p | nc -l 4000 >p
<WHY NO OUTPUT HERE??>

и HostA :

$ mkfifo p
$ ./procA <p | nc HostB 4000 >p
<WHY NO OUTPUT HERE??>

Примечания:

  1. Я убедился, что порт 4000 открыт на HostB.
  2. Однонаправленная связь, такая как следующая, , кажется, работает :

Вкл. HostB :

$ mkfifo p
$ ./procB <p | nc -l 4000 >p

Вкл. HostA :

$ ./procA | nc HostB 4000 
HostB Output: Wed Jan 11 13:53:37 IST 2012
HostB Output: Wed Jan 11 13:53:39 IST 2012
HostB Input: HostA Output: Wed Jan 11 13:55:02 IST 2012
HostB Output: Wed Jan 11 13:53:40 IST 2012
HostB Input: HostA Output: Wed Jan 11 13:55:04 IST 2012
HostB Output: Wed Jan 11 13:53:41 IST 2012
HostB Input: HostA Output: Wed Jan 11 13:55:05 IST 2012
HostB Output: Wed Jan 11 13:53:42 IST 2012
^C

Теперь я знаю, что nc поставляется с опцией INSECURE -e, которую можно каким-то образом использовать, если она включена в вашем бинарном файле nc, но, если у меня нет опции -e, как Я соединяю 2 удаленных процесса друг с другом через nc? В принципе, где я иду неправильно? Почему нет выхода в местах, которые я указал выше? Большое спасибо заранее.

1 Ответ

0 голосов
/ 12 января 2012

Поведение, описанное выше, является на самом деле правильным поведением, просто я не осознавал, что это было.

Везде, где я жаловался на <WHY NO OUTPUT HERE??>, это было / это потому, что выходы терминалов были перенаправлены на локальные FIFO. (Не удивительно, что вы ничего не видите на терминале!)

Кроме того, в примечаниях (2) выше не совсем верно, что сообщение является однонаправленным; он очень двунаправленный, просто вы не видите выходных данных на HostB, еще раз, потому что stdin и stdout перенаправлены с терминала на fifo. Таким образом, вы правильно видите вывод procB на HostA, который является ничем иным, как выводом procA на HostA, отправленным на procB на HostB как вход procB!

Вау!

EDIT: Чтобы увидеть вывод на каждом терминале, используйте tee, например:

На хосте B:

$ mkfifo p
$ ./procB <p | nc -l 4000 | tee p

На HostA:

$ mkfifo p
$ ./procA <p | nc HostB 4000 | tee p
...