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


12

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

例:

  1. 计算机1的脚本在后台运行,该脚本打开了端口1234以访问传入流量

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

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

  4. 现在已设置变量$ MESSAGE,脚本运行功能

我该怎么做呢?

Answers:


12

应该可以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

你测试过了吗?

现在已重写和测试;)
rudimeier '16

1
我从您的解决方案中得到启发,发现了一种与netcat兼容的方法:nc -l 7777 | ./getmsg.sh
丹尼尔(Daniel)

很高兴听你这样说。但netcat存在一次连接。socat如果从命令行中删除“,fork”,将执行相同的操作。
rudimeier

7

UCSPI-TCP方式

除了netcat,还有其他工具集。以下是其中一些用法。它们都假定存在一个service可以运行your 的脚本func,无论该脚本是什么:

#!/ bin / sh
同时读取-r MESSAGE
做
    回声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 ./服务

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-networking,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-accesss6-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-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-checksetuidgid链中的工具来构建更复杂的服务器。

#!/ bin / nosh
tcp-socket-listen --combine4and6 :: 7777
setuidgid非特权用户
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
。/服务

Pape ipsvd

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

#!/ bin / sh -e
exec tcpsvd -v 0.0.0.0 7777 ./服务

UCSPI UDP

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

尽管上述某些工具包可用于构建UDP服务器的方式与使用它们来构建TCP服务器的方式类似(udp-socket-listen在nosh中为cf ),但是使用Shell脚本构建实际的服务程序还是很棘手的,因为Shell的内置程序并不当标准输入是数据报套接字时,一定能很好地应对。

进一步阅读

  • 协议:
  • 工具集:
    • 丹尼尔·伯恩斯坦。ucspi-tcp。cr.yp.to.
    • s6-网络。洛朗·贝科特(Laurent Bercot)。skarnet.org。
    • s6。洛朗·贝科特(Laurent Bercot)。skarnet.org。
    • 乔纳森·德博因·波拉德(2016)sh 软件。
    • ipsvd。Gerrit Pape。smarden.org。
  • 参考手册:
    • 丹尼尔·伯恩斯坦。tcpserver程序。ucspi-tcp。
    • 欧文·霍夫曼(Erwin Hoffmann)。 tcpserverucspi-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。
    • 乔纳森·德博因·波拉德(2016)tcpservernosh指南。软件。
    • 乔纳森·德博因·波拉德(2016)tcp-socket-listennosh指南。软件。
    • 乔纳森·德博因·波拉德(2016)tcp-socket-acceptnosh指南。软件。
    • 乔纳森·德博因·波拉德(2016)ucspi-socket-rules-checknosh指南。软件。
    • 乔纳森·德博因·波拉德(2016)setuidgidnosh指南。软件。
    • 乔纳森·德博因·波拉德(2016)udp-socket-listennosh指南。软件。
    • tcpsvdipsvd。Gerrit Pape。smarden.org。

0

也可以通过udpsvdUbuntu / 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
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.