Dan*_*iel 19 networking bash shell-script daemon
我想知道如何让 shell 脚本监听某个端口(也许使用 netcat?)。希望当消息发送到该端口时,脚本会记录该消息,然后运行一个函数。
例子:
计算机 1 在后台运行脚本,脚本打开端口 1234 以接收流量
计算机 2 向计算机 1 的端口 1234 发送消息“hello world”
计算机 1 上的脚本将消息“hello world”记录到变量 $MESSAGE
脚本运行函数,因为变量 $MESSAGE 已设置
我该怎么做?
rud*_*ier 18
应该可以socat。
编写这样一个脚本“getmsg.sh”来通过标准输入接收一条消息:
#!/bin/bash
read MESSAGE
echo "PID: $$"
echo "$MESSAGE"
Run Code Online (Sandbox Code Playgroud)
然后运行此socat命令为端口 7777 上的每个 tcp 连接调用我们的脚本:
socat -u tcp-l:7777,fork system:./getmsg.sh
Run Code Online (Sandbox Code Playgroud)
从另一个 shell 发送测试消息:
echo "message 1" | netcat localhost 7777
Run Code Online (Sandbox Code Playgroud)
Jde*_*eBP 12
除了 netcat 之外,还有其他工具集。以下是其中一些的使用方法。他们都假设存在一个service运行您的 的脚本func,无论它是什么:
#!/bin/sh
读时 -r MESSAGE
做
echo 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 ./service
Bernstein ucspi-tcp 有支持 IPv6 的增强版本。使用 Erwin Hoffman's,tcpserver尝试将 IPv4 和 IPv6 合二为一(如果操作系统支持,一些不支持)并生成service脚本:
#!/bin/sh -e exec tcpserver -v -P -R -H -l 0 ::0 7777 ./service
与洛朗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 套接字监听 0.0.0.0 7777 tcp-socket-accept --verbose --localname 0 。/服务
#!/bin/nosh tcp 套接字监听:: 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 执行 tcpsvd -v 0.0.0.0 7777 ./service
service当标准输入是流套接字时,通用脚本可以处理。但是您没有明确指定 TCP。
尽管前面提到的一些工具包可用于以类似于如何使用它们构建 TCP 服务器的方式构建 UDP 服务器(参见udp-socket-listennosh 中的),但使用 shell 脚本构建实际的服务程序是很棘手的,因为 shell 的内置程序没有当标准输入是数据报套接字时,一定能很好地应对。
tcpserver程序。ucspi-tcp。tcpserver. ucspi-tcp6。fehcom.des6-tcpserver4. 洛朗·贝尔科特。 s6-网络。skarnet.org。s6-tcpserver6. 洛朗·贝尔科特。 s6-网络。skarnet.org。s6-tcpserver-access. 洛朗·贝尔科特。 s6-网络。skarnet.org。s6-applyuidgid. 洛朗·贝尔科特。 s6。skarnet.org。tcpserver. 小吃指南。软件。tcp-socket-listen. 小吃指南。软件。tcp-socket-accept. 小吃指南。软件。ucspi-socket-rules-check. 小吃指南。软件。setuidgid. 小吃指南。软件。udp-socket-listen. 小吃指南。软件。tcpsvd. ipsvd。格里特·帕佩。smarden.org。