我知道某个进程正在写入某个 unix 域套接字 ( /var/run/asterisk/asterisk.ctl
),但我不知道发送者的 pid。如何找出谁在向套接字写入数据?我尝试过:
sudo lsof /var/run/asterisk/asterisk.ctl
但它只是列出了套接字的所有者。我想知道谁在写/读这个套接字,我也想嗅探数据。这可能吗?
我知道某个进程正在写入某个 unix 域套接字 ( /var/run/asterisk/asterisk.ctl
),但我不知道发送者的 pid。如何找出谁在向套接字写入数据?我尝试过:
sudo lsof /var/run/asterisk/asterisk.ctl
但它只是列出了套接字的所有者。我想知道谁在写/读这个套接字,我也想嗅探数据。这可能吗?
是的,你可以这样做。你所需要的只是systemtap。
考虑一个示例 systemtap 脚本,它将打印读取或写入指定 inode 的任何程序的 PID 和进程名称(您的 Unix 域套接字就是这样的东西)。
您可以简单地修改此脚本以打印正在读取/写入的实际数据;我将把这样做作为练习留给读者。
简短的答案是否定的,也不容易。
在 Linux 上 lsof 依赖于
/proc/net/unix
检索有关 UNIX 域套接字的信息。该接口列出了所有绑定的套接字,但它不跟踪端点。因此,您可以看到存在哪些套接字,但看不到连接到它们的内容。在某个地方跟踪此信息,必须对其进行跟踪,否则套接字连接将不起作用。我还没有找到任何机制来检索连接信息。嗅探问题稍微有趣一些,但同样令人失望。我所说的“不容易”是指不存在任何可以潜入并获取数据的钩子。最接近的模拟是使用 tcpdump 或 Wireshark,两者都使用 libpcap 来实际完成繁重的工作。虽然网络 (AF_INET) 和 UNIX 域 (AF_UNIX) 都是使用
socket()
函数调用创建的,它们都connect()
用于连接、使用read()
和write()
处理数据,但它们由不同的内核子系统处理。这有一个不幸的副作用,即 libpcap 不是为与 UNIX 域套接字一起工作而设计的。这个问题有一个稍微不那么暗淡的一面。看一下手册页
recv(2)
。这是使用的较低级别的系统调用read()
。有一个recv()
被调用的标志MSG_PEEK
。这将允许您嗅探通过 UNIX 域套接字的流量。所以这是光明的一面,黑暗的一面是,据我所知,目前不存在任何旨在做到这一点的应用程序。所以你正在寻找一些开发工作。我真的希望对你的问题的两个部分都有一个简单的F'YEAH 答案。
我知道这并没有回答主要问题,但我最终到了这里,只搜索套接字上的嗅探通信。我决定为像我这样的人发帖。我是这样做的:
您可以删除 -x 并保留 -v 以进行 ascii 通信。希望对某人有所帮助。
socat -t100 UNIX-LISTEN:/tmp/file.sock,mode=777,reuseaddr,fork STDOUT
没有重复输出,没有循环输出。先前评论“.sock.socat”的错误