如何设置脚本在端口收到消息时执行

Dan*_*iel 19 networking bash shell-script daemon

我想知道如何让 shell 脚本监听某个端口(也许使用 netcat?)。希望当消息发送到该端口时,脚本会记录该消息,然后运行一个函数。

例子:

  1. 计算机 1 在后台运行脚本,脚本打开端口 1234 以接收流量

  2. 计算机 2 向计算机 1 的端口 1234 发送消息“hello world”

  3. 计算机 1 上的脚本将消息“hello world”记录到变量 $MESSAGE

  4. 脚本运行函数,因为变量 $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

UCSPI-TCP方式

除了 netcat 之外,还有其他工具集。以下是其中一些的使用方法。他们都假设存在一个service运行您的 的脚本func,无论它是什么:

#!/bin/sh
读时 -r MESSAGE
做
    echo 1>&2 "${TCPREMOTEIP}" "${TCPREMOTEPORT}" rx "${MESSAGE}"
    功能
完毕

TCPREMOTEIPTCPREMOTEPORT环境变量由UCSPI-TCP协议中定义的。

该脚本使用各种工具集作为每个 TCP 连接的单个进程生成。在下文中,这些工具显示为在一个简短的脚本中使用。这样的脚本,通常命名为run,是人们在 daemontools-family 服务管理器下运行它们的方式。它们当然可以直接调用。

伯恩斯坦 ucspi-tcp

使用 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 和 execline

与洛朗Bercot的S6-网络,s6-tcpserver4s6-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 UCSPI 工具

使用 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
。/服务

纸ipsvd

使用 Gerrit Pape 的 ipsvd,tcpsvd生成service脚本:

#!/bin/sh -e
执行 tcpsvd -v 0.0.0.0 7777 ./service

UCSPI-UDP

service当标准输入是套接字时,通用脚本可以处理。但是您没有明确指定 TCP。

尽管前面提到的一些工具包可用于以类似于如何使用它们构建 TCP 服务器的方式构建 UDP 服务器(参见udp-socket-listennosh 中的),但使用 shell 脚本构建实际的服务程序是很棘手的,因为 shell 的内置程序没有当标准输入是数据报套接字时,一定能很好地应对。

进一步阅读