Перенаправить стандартный ввод и вывод на порты

10

Я хотел бы взять программу, Pкоторая читает из stdin& пишет в stdout, но соединяет ее ncили что-то подобное, что она читает с определенного порта и выводит на другой порт.

# The reading is easy, here P reads from port 50505
nc -l 50505 | P

Как мне заставить его написать обратно, чтобы сказать порт 60606?

Иминь Ронг
источник
Ваш вопрос неясен, как указано. Вы имеете в виду, что кто-то может открыть 2 TCP-соединения с вашей машиной, одно - с портом 50505, а другое - с портом 50506, отправить данные по первому каналу, который должен быть передан, Pи ожидать чтения результатов Pвторого TCP-соединения? Почему именно тег UDP?
Стефан Шазелас
Да! Насколько UDPя думаю, я хотел ports, но это не существующее ключевое слово, поэтому я подумал TCP, и я думаю, что я добавил UDPиз рефлекса.
Иминь Ронг

Ответы:

12

Я имею в виду, что кто-то может открыть 2 TCP-соединения с вашей машиной, одно - к порту 50505, а другое - к порту 60606, отправить данные по первому каналу, предназначенному для передачи на P, и ожидать чтения вывода P из второго соединения TCP, тогда это будет:

< /dev/null nc -q -1 -l 50505 | P | nc -l 60606 > /dev/null

Или с socat:

socat -u tcp-listen:50505,reuseaddr - | P | socat -u - tcp-listen:60606,reuseaddr

Чтобы Pотправить свой вывод обратно в то же соединение:

socat tcp-listen:50505,reuseaddr exec:P
Стефан Шазелас
источник
3

Вам не нужно ncдля работы с портами. bashможет сделать это сам:

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

/dev/fd/fd
    If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
    File descriptor 0 is duplicated.
/dev/stdout
    File descriptor 1 is duplicated.
/dev/stderr
    File descriptor 2 is duplicated.
/dev/tcp/host/port
   If host is a valid hostname or Internet address, and port is an integer 
   port number or service name, bash attempts to open a TCP connection to
   the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer 
    port number or service name, bash attempts to open a UDP connection to
    the corresponding socket.
Хауке Лагинг
источник
3
/dev/tcpчасто отключается и не может быть использован для прослушивания . Вам нужно , zshесли вы хотите оболочку , которая может создать прослушивание TCP сокетов.
Стефан Шазелас
@ StéphaneChazelas Я должен признать, что никогда не пытался. Это ничего не говорит об этом ограничении на странице руководства, не так ли?
Хауке Лагинг
Ну, как бы ты это сделал? Сокет слушателя - это дверь для создания более приемлемых сокетов, перенаправления не работают для этого. zsh использует для этого встроенную функцию ( ztcp -lдля прослушивания и ztcp -aдля приема соединений на слушающем сокете).
Стефан Шазелас