4

我在一个嵌入式平台(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 编程有足够的了解。

4

2 回答 2

5

自从我处理这个话题以来已经有一段时间了,实际上并没有去测试我的一个熟人, Busybox 的维护者Denys Vlasenko几个月前提出的解决方案。因为我刚刚在 StackOverflow 上查看了我的帐户,再次看到了问题,让我与您分享他的见解。也许它对某人有帮助:

我可以建议的一种相对简单的技巧是执行以下操作:

我假设您有一个正在运行的服务器应用程序,它打开了一个 Unix 域侦听套接字(例如,/tmp/some.socket),并且客户端程序连接到它并与服务器通信。

  • 重命名/tmp/some.socket->/tmp/some.socket1
  • 创建一个新的套接字 /tmp/some.socket
  • 监听新的客户端连接
  • 对于每个这样的连接,打开另一个/tmp/some.socket1到原始服务器进程的连接
  • 将数据(客户端<->服务器)通过生成的套接字对(这样做的代码与 telnetd 服务器所做的非常相似)直到任何一方出现 EOF。

在抽取数据时,可以轻松查看、保存,甚至在需要时进行修改。

缺点是每次重新启动原始服务器程序时都需要重新启动这个嗅探器程序。

这与Celada也回答的类似。也感谢他!不过,丹尼斯的回答更具体一些。

我反问:

这听起来很奇怪,是的,因为重启的必要性,但可行。我不是 C 程序员,但我一直想知道你是否知道一个命令行工具可以为我完成传递和协议或基于事件的触发工作。我有一个来自我们项目的人可以为此破解一个小 C 二进制文件,但我不确定他是否喜欢这样做。如果有预制的东西,我会更喜欢它。甚至可以使用 BusyBox 小程序的(组合)来完成吗?

Denys再次回答:

您需要使用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冗长的方式运行)。

如果您需要更复杂的处理,请将 nc invocation 替换script.sh 为自定义程序。

于 2012-06-12T11:45:49.833 回答
0

我认为没有任何东西可以让您干净地嗅探 UNIX 套接字流量。以下是一些选项:

  • 安排发送方进程连接到正在侦听的不同套接字。还作为客户端连接到原始套接字。收到数据后,请注意您要注意的数据,并将所有内容传递给原始套接字。
  • 使用 netlink 套接字 ( , 等...) 自行监控系统的 IP 地址RTM_NEWADDR更改RTM_NEWLINK
  • ip monitor作为外部进程运行并在其标准输出上写入有关添加和删除 IP 地址的消息时采取措施。
于 2011-12-29T10:34:06.783 回答