我在一个嵌入式平台(mipsel体系结构,Linux 2.6内核)上,我需要在两个闭源进程(路由器固件)之间监视IPC,以便对某个事件做出反应(由于DSL重新连接,动态IP更改).到目前为止,我通过strace发现的是,无论何时IP发生变化,DSL守护进程都会将特殊消息写入绑定到特定文件名的UNIX域套接字.该消息由另一个守护程序使用.
现在这是我的要求:我想监视通过该特定UNIX域套接字的数据流,并在检测到某个消息时触发事件(调用shell脚本).我尝试使用inotify监视文件名,但它不适用于套接字文件.我知道我可以一直运行strace,过滤其输出并对过滤后的日志文件中的更改做出反应,但这样做太重了,因为strace确实会降低系统速度.我也知道我可以通过cron轮询IP地址,但是我想要一个看门狗,而不是一个轮询解决方案.我有兴趣了解是否有一个工具可以专门监视UNIX域套接字并对预定义方向流动的特定消息做出反应.我想象类似于inotifywait的东西,即工具应该等待某个事件,然后退出,这样我就可以对事件作出反应并循环回到再次启动工具,等待同一类型的下一个事件.
是否有任何现有的Linux工具能够做到这一点?或者是否有一些简单的C代码用于独立二进制文件,我可以在我的平台上编译(uClibc,而不是glibc)?我不是C专家,但能够运行makefile.使用shell中的二进制文件没问题,我对shell编程了解得足够多.
自从我处理这个话题已经有一段时间了,并且实际上并没有开始测试我的熟人,Busybox的维护者Denys Vlasenko几个月前提出了解决方案.因为我刚刚在StackOverflow上查看了我的帐户并再次看到了这个问题,让我与您分享他的见解.也许这对某人有帮助:
我可以建议的一个相对容易的黑客是执行以下操作:
我假设您有一个正在运行的服务器应用程序,它打开了一个Unix域侦听套接字(比方说
/tmp/some.socket
),客户端程序连接到它并与服务器通信.
重命名
/tmp/some.socket
- >/tmp/some.socket1
创建一个新的socket /tmp/some.socket
听取新的客户连接
对于每个此类连接,打开
/tmp/some.socket1
与原始服务器进程的另一个连接在所得到的套接字对之间泵送数据(客户端< - >服务器)(这样做的代码与telnetd服务器的做法非常相似),直到任何一方的EOF.
在您抽取数据时,可以轻松查看数据,保存数据,甚至在需要时进行修改.
缺点是每次重新启动原始服务器程序时都需要重新启动此嗅探器程序.
这与Celada也回答的相似.还要感谢他!不过,丹尼斯的回答更为具体.
我回答说:
听起来很糟糕,是的,因为需要重新启动,但可行.我不是一名C程序员,我一直在想,如果你知道一个命令行工具可以为我做传递和协议或基于事件的触发工作.我有一个来自我们项目的人可能会破解一个小C二进制文件,但我不确定他是否喜欢这样做.如果有预制的东西,我会更喜欢它.它甚至可以用(组合)BusyBox小程序完成,也许吧?
丹尼斯再次回答:
您需要构建busybox
CONFIG_FEATURE_UNIX_LOCAL=y
.运行以下作为拦截服务器:
busybox tcpsvd -vvvE local:/tmp/socket 0 ./script.sh其中script.sh是与"原始服务器"的简单直通连接:
#!/bin/sh busybox nc -o /tmp/hexdump.$$ local:/tmp/socket1 0作为示例,我将十六进制日志记录添加到文件(
-o FILE
选项).通过运行模拟的"原始服务器"来测试它:
busybox tcpsvd -vvvE local:/tmp/socket1 0 sh -c 'echo PID:$$'并通过连接到"拦截服务器":
echo Hello world | busybox nc local:/tmp/socket 0您应该看到"PID:19094"消息,并有一个
/tmp/hexdump.19093
带有转储数据的新文件.这两个tcpsvd进程也应该打印一些日志(它们以-vvv
详细程度运行).如果需要更复杂的处理,请
script.sh
使用自定义程序替换nc调用.