我知道某个进程正在写入某个 unix 域套接字 ( /var/run/asterisk/asterisk.ctl
),但我不知道发件人的 pid。我怎样才能找出谁在写套接字?我试过:
sudo lsof /var/run/asterisk/asterisk.ctl
Run Code Online (Sandbox Code Playgroud)
但它只是列出了套接字的所有者。我想知道谁在写/读这个套接字,我也想嗅探数据。这可能吗?
Mic*_*ton 12
是的,你可以这样做。您只需要 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()
called MSG_PEEK
。这将允许您嗅探通过 UNIX 域套接字的流量。所以这是好的一面,坏的一面是,据我所知,目前不存在任何旨在执行此操作的应用程序。所以你正在考虑一些开发工作。
我真的希望有是F'YEAH的一个不错的简单回答你的问题的两个部分。
小智 5
我知道这并没有回答主要问题,但我已经结束了,只是在套接字上寻找嗅探通信。我决定为像我这样的人发帖。这是我如何做到的:
$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock
您可以删除 -x 并保留 -v 进行 ascii 通信。希望能帮助某人。