将stdin和stdout重定向到端口


10

我想要一个程序P,该程序可以从stdin&读取和写入stdout,但可以将其连接到nc或从任何端口读取并输出到另一个端口的任何程序。

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

我该如何写回端口60606?


如上所述,您的问题不清楚。您的意思是某人可能会打开2条与您的计算机的TCP连接,其中1条连接到端口50505,另一条连接到端口50506,将第一个数据发送给第一个要馈送给您的计算机,P并希望P从第二个TCP连接中读取输出?为什么使用UDP标签?
斯特凡Chazelas

是! 至于UDP,我想我想要的ports,但是那不是一个现有的关键字,所以我想TCP,我想我是UDP出于反思。
Yimin Rong

Answers:


12

我的意思是,某人可能会打开与您的计算机的2条TCP连接,其中一条连接到端口50505,另一条连接到端口60606,在第一个要发送给P的数据上发送数据,并期望从第二个TCP连接读取P的输出,那么将是:

< /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套接字的外壳,则需要。
斯特凡Chazelas

@StéphaneChazelas我必须承认我从未尝试过。它没有在手册页中说明此限制,是吗?
Hauke Laging

好吧,你会怎么做?侦听器套接字是创建更多接受套接字的门,重定向在此方面效果不佳。zsh为此使用了一个内置函数(ztcp -l用于侦听并 ztcp -a接受侦听套接字上的连接)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.