首页 文章

监视程序监视UNIX域套接字,触发特定内容上的事件

提问于
浏览
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编程了解得足够多 .

2 回答

  • 5

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

    我可以建议的一个相对容易的黑客是执行以下操作:我假设您有一个正在运行的服务器应用程序,它打开了一个Unix域侦听套接字(比如说/tmp/some.socket),并且客户端程序连接到它并与之交谈服务器 . 重命名/tmp/some.socket - > /tmp/some.socket1创建一个新的socket /tmp/some.socket监听它为每个这样的连接的新客户端连接,打开另一个连接到/tmp/some.socket1到原始服务器处理泵数据(客户端< - >服务器)通过结果对套接字(代码执行此操作与telnetd服务器完全相似),直到任何一方的EOF . 在您抽取数据时,可以轻松查看数据,保存数据,甚至在需要时进行修改 . 缺点是每次重新启动原始服务器程序时都需要重新启动此嗅探器程序 .

    这类似于 Celada 也回答了 . 还要感谢他!不过,丹尼斯的回答更为具体 .

    我回答说:

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

    丹尼斯再次回答:

    您需要使用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'echion PID:$$'
    并通过连接到“拦截服务器”:echo Hello world | busybox nc local:/ tmp / socket 0
    您应该看到“PID:19094”消息并且有一个带有转储数据的新/tmp/hexdump.19093文件 . 这两个tcpsvd进程也应该打印一些日志(它们使用-vvv verbosity运行) . 如果需要更复杂的处理,请将script.sh中的nc调用替换为自定义程序 .

  • 0

    我认为没有任何东西可以让你干净利落地查看UNIX套接字流量 . 以下是一些选项:

    • 安排发件人进程连接到 you 正在侦听的其他套接字 . 还可以作为客户端连接到原始套接字 . 收到数据后,请注意您要注意的数据,并将所有内容传递给原始套接字 .

    • 使用netlink套接字( RTM_NEWADDRRTM_NEWLINK 等)自行监控系统的IP地址变化 .

    • ip monitor 作为外部进程运行,并在其标准输出上写入有关添加和删除的IP地址的消息时执行操作 .

相关问题