我在嵌入式平台(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编程了解得足够多。
答案 0 :(得分:5)
自从我处理这个话题已经有一段时间了,并没有真正开始测试我的熟人, Denys Vlasenko ,Busybox的维护者,建议作为我的几个解决方案几个月前。因为我刚刚在StackOverflow上查看了我的帐户并再次看到了这个问题,让我与您分享他的见解。也许这对某人有帮助:
我可以建议的一个相对容易的黑客行为是:
我假设您有一个正在运行的服务器应用程序,它打开了一个Unix域侦听套接字(例如,
/tmp/some.socket
),客户端程序连接到它并与服务器通信。
- 重命名
/tmp/some.socket
- >/tmp/some.socket1
- 创建一个新的套接字/tmp/some.socket
- 收听新客户连接
- 对于每个此类连接,打开与
/tmp/some.socket1
到原始服务器进程的另一个连接- 泵送数据(客户端< - >服务器)在结果对的套接字上(这样做的代码与telnetd服务器的做法非常相似),直到任何一方的EOF。
当你抽取数据时,很容易看到它,保存它,甚至在你需要的时候修改它。
缺点是每次重新启动原始服务器程序时都需要重新启动此嗅探器程序。
这类似于 Celada 也回答了。还要感谢他!不过Denys的回答更为具体。
我回答说:
这听起来很糟糕,是的,因为需要重启,但可行。 我不是一个C程序员,我一直在想,如果你知道一个 命令行工具,可以执行传递和协议或 基于事件的触发工作对我而言。我有一个来自我们项目的人 谁可以破解一点C二进制文件,但我不确定他是否 喜欢这样做。如果有预制的东西,我会更喜欢它。它可以 甚至可以使用(组合)BusyBox小程序完成,也许?
Denys再次回答:
您需要使用
CONFIG_FEATURE_UNIX_LOCAL=y
构建busybox。运行以下作为拦截服务器:
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调用 使用自定义程序。
答案 1 :(得分:0)
我认为没有任何东西可以让你干净地嗅到UNIX套接字流量。以下是一些选项:
RTM_NEWADDR
,RTM_NEWLINK
等)自行监控系统的IP地址变更。)。ip monitor
作为外部流程运行,并在写入有关已添加&的消息时执行操作删除了标准输出的IP地址。