Answers:
简短的答案是否定的,也不容易。
在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的一个不错的简单回答你的问题的两个部分。
是的,您可以这样做。您需要的只是systemtap。
考虑以下示例systemtap脚本之一,该脚本将显示读取或写入指定inode的任何程序的PID和进程名(而您的Unix域套接字就是这样)。
您可以修改此脚本以打印正在读取/写入的实际数据。我将留给读者练习。
我知道这不能回答主要问题,但是我到这里为止了,只是在嗅探套接字上的通信。我决定为像我这样的其他人发帖。这是我的做法:
$> 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通信。希望能对某人有所帮助。