Answers:
应该可以socat
。
编写这样的脚本“ getmsg.sh”以通过stdin接收一条消息:
#!/bin/bash
read MESSAGE
echo "PID: $$"
echo "$MESSAGE"
然后运行以下socat
命令为端口7777上的每个tcp连接调用脚本:
socat -u tcp-l:7777,fork system:./getmsg.sh
从另一个外壳发送测试消息:
echo "message 1" | netcat localhost 7777
netcat
存在一次连接。socat
如果从命令行中删除“,fork”,将执行相同的操作。
除了netcat,还有其他工具集。以下是其中一些用法。它们都假定存在一个service
可以运行your 的脚本func
,无论该脚本是什么:
#!/ bin / sh 同时读取-r MESSAGE 做 回声1>&2“ $ {TCPREMOTEIP}”“ $ {TCPREMOTEPORT}” rx“ $ {MESSAGE}” 功能 做完了
的TCPREMOTEIP
和TCPREMOTEPORT
环境变量由UCSPI-TCP协议中定义的。
使用各种工具集,该脚本作为每个TCP连接的独立进程生成。在下面的内容中,这些工具显示为在短脚本中使用。这种脚本通常称为run
,它是如何在daemontools-family服务管理器下运行它们的方法。当然可以直接调用它们。
使用Daniel J. Bernstein的ucspi-tcp,tcpserver
产生了service
脚本:
#!/ bin / sh -e exec tcpserver -v -P -R -H -l 0 0.0.0.0 7777 ./服务
Bernstein ucspi-tcp有支持IPv6的增强版本。使用Erwin Hoffman,tcpserver
尝试同时处理IPv4和IPv6(如果操作系统支持,则不支持)并生成service
脚本:
#!/ bin / sh -e exec tcpserver -v -P -R -H -l 0 :: 0 7777 ./服务
与洛朗Bercot的S6-网络,s6-tcpserver4
并s6-tcpserver6
分别处理IPv4和IPv6,并酿出service
脚本:
#!/ command / execlineb s6-tcpserver4 -v 0.0.0.0 7777 。/服务
#!/ command / execlineb s6-tcpserver6 -v :: 0 7777 。/服务
可以通过插入诸如s6-tcpserver-access
和s6-applyuidgid
之前的链中的工具来构建更复杂的服务器./service
。
使用nosh工具集,tcp-socket-listen
侦听TCP套接字,并在操作系统支持的情况下再次同时处理IPv4和IPv6,并tcp-socket-accept
依次生成service
脚本:
#!/ bin / nosh tcp-socket-listen --combine4and6 :: 7777 tcp-socket-accept --verbose --localname 0 。/服务
或者一个在诸如OpenBSD的操作系统上运行两个单独的进程:
#!/ bin / nosh tcp-socket-listen 0.0.0.0 7777 tcp-socket-accept --verbose --localname 0 。/服务
#!/ bin / nosh tcp-socket-listen :: 7777 tcp-socket-accept --verbose --localname :: 。/服务
可以通过插入ucspi-socket-rules-check
和setuidgid
链中的工具来构建更复杂的服务器。
#!/ bin / nosh tcp-socket-listen --combine4and6 :: 7777 setuidgid非特权用户 tcp-socket-accept --verbose --localname 0 ucspi-socket-rules-check --verbose 。/服务
使用Gerrit Pape的ipsvd tcpsvd
生成service
脚本:
#!/ bin / sh -e exec tcpsvd -v 0.0.0.0 7777 ./服务
service
当标准输入是流套接字时,通用脚本可以处理。但是您没有明确指定TCP。
尽管上述某些工具包可用于构建UDP服务器的方式与使用它们来构建TCP服务器的方式类似(udp-socket-listen
在nosh中为cf ),但是使用Shell脚本构建实际的服务程序还是很棘手的,因为Shell的内置程序并不当标准输入是数据报套接字时,一定能很好地应对。
tcpserver
程序。ucspi-tcp。tcpserver
。 ucspi-tcp6。fehcom.de。s6-tcpserver4
。洛朗·贝科特(Laurent Bercot)。 s6-网络。skarnet.org。s6-tcpserver6
。洛朗·贝科特(Laurent Bercot)。 s6-网络。skarnet.org。s6-tcpserver-access
。洛朗·贝科特(Laurent Bercot)。 s6-网络。skarnet.org。s6-applyuidgid
。洛朗·贝科特(Laurent Bercot)。 s6。skarnet.org。tcpserver
。 nosh指南。软件。tcp-socket-listen
。 nosh指南。软件。tcp-socket-accept
。 nosh指南。软件。ucspi-socket-rules-check
。 nosh指南。软件。setuidgid
。 nosh指南。软件。udp-socket-listen
。 nosh指南。软件。tcpsvd
。 ipsvd。Gerrit Pape。smarden.org。也可以通过udpsvd
Ubuntu / Debian上的可用工具(请参阅联机帮助页)以及busybox的内置工具来完成。例:
# simple UDP "echo" on port 9998
udpsvd 0.0.0.0 9998 cat
cat
用您的shell脚本替换执行,stdin是数据包。
使用netcat
,您可以循环运行以继续侦听,并将每个数据包传递给myscript
:
while true; do nc -ul 9998 | myscript.sh; done
如果要将所有接收到的数据包作为流传递给脚本的单个调用:
# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh