如何找出本地套接字另一端的程序?

时间:2009-05-04 16:21:24

标签: linux debugging sockets

我的Linux系统上的一个进程,strace告诉我,正在讨论一个有文件描述符10的套接字.lsof告诉我这是一个带有inode 11085的unix套接字,而netstat进一步告诉我inode 11085是一个流套接字,它已经连接起来了。

鉴于此进程没有任何其他线程,因此系统上必须有另一个连接到此套接字另一端的进程。我怎么知道它是什么?

更新

lsof作者here有一些启发。从本质上讲,Linux似乎并不提供这些信息。

8 个答案:

答案 0 :(得分:11)

ss -p

会告诉你。 (如果套接字不归内核本身所有。)

答案 1 :(得分:7)

netstat -p有帮助吗?

来自Manpage:

  -p,
  --program Show the PID and name of the program to which each socket belongs.

答案 2 :(得分:4)

这个怎么样:grep 11085 /proc/net/unix。假设在您感兴趣的inode的行上存在非空路径,grep/proc/net/unix中的路径找到连接另一端的inode,然后使用@ efficientjelly将另一个inode映射到pid的方法。

这里的一个关键点是两个连接的套接字每个都有不同的inode编号。

答案 3 :(得分:2)

看起来如果你真的很绝望,你可以使用一些内核调试器直接从Linux内核内存中获取这些信息。使用RHEL5的“崩溃”工具:

  • 获取未压缩的vmlinux图像(例如,安装kernel-debuginfo rpm,或从该rpm中提取vmlinux文件)
  • 运行crash /path/to/vmlinux
  • net -s 12345列出了PID 12345
  • 的所有套接字
  • 找到有趣的套接字(必须是family / type UNIX:STREAM),并记下它的SOCK值:
    • PID: 12345 TASK: e903d000 CPU: 0 COMMAND: "someapp"
    • FD SOCKET SOCK FAMILY:TYPE SOURCE-PORT DESTINATION-PORT
    • 36 cadd0240 c8a64040 UNIX:STREAM
  • 您现在拥有此套接字unix_sock struct的地址
    • 基本上,unix_sock.peer.name是套接字另一端的名称结构
    • 使用:p *(*(*((struct unix_sock*)( (struct unix_sock*)0xc8a64040)->peer)).addr).name
    • 打印

真的很遗憾这些信息不会直接导出到用户空间。

答案 4 :(得分:2)

我观察到了:

在客户端调用fd的{​​{1}}的inode总是比从服务器端的connect()调用返回的那个大一个。

我的编程的输出示例:

accept()

虽然client_fd=4 /proc/4436/fd/4 inode=3072 is socket node: 3072 socket: /tmp/unix.socket f0be8960: 00000003 00000000 00000000 0001 03 3072 /tmp/unix.socket /proc/9293/fd/43 fd:43 inode=3073 is socket node: 3073 socket: f0be81e0: 00000003 00000000 00000000 0001 03 3073 中没有显示绑定路径。

YMMV,我还没有调查潜在的机制。

答案 5 :(得分:2)

我写了一个tool,它使用gdb method可靠地获取套接字对等信息,不需要内核调试符号。

要使进程连接到给定套接字,请将其传递给inode编号:

# socket_peer 11085
3703 thunderbird 

要立即查找所有进程使用netstat_unix,它会向netstat的输出添加一列:

# netstat_unix
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Peer PID/Program name  Path
unix  3      [ ]         STREAM     CONNECTED     6825     982/Xorg             1497/compiz            /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     6824     1497/compiz          982/Xorg                 
unix  3      [ ]         SEQPACKET  CONNECTED     207142   3770/chromium-brows  17783/UMA-Session-R       
unix  3      [ ]         STREAM     CONNECTED     204903   1523/pulseaudio      3703/thunderbird       
unix  3      [ ]         STREAM     CONNECTED     204902   3703/thunderbird     1523/pulseaudio           
unix  3      [ ]         STREAM     CONNECTED     204666   1523/pulseaudio      3703/thunderbird       
...

如果您需要易于解析的输出,请尝试netstat_unix --dump 有关详细信息,请参阅https://github.com/lemonsqueeze/unix_sockets_peers

有关信息,inode +1/-1 hack不可靠。它大部分时间都可以工作,但如果你运气不好,它会失败或者(更糟)返回错误的套接字。

答案 6 :(得分:1)

如果由于某种原因您没有运气适当的lsof和netstat选项,您还可以执行以下操作:

find /proc -lname '*11085*' 2> /dev/null

答案 7 :(得分:0)

lsof | grep 11085

lsof应该以root身份执行。

我一直在Linux系统上尝试使用lsof,lsof -U显示NODE列下的所有数字都是唯一的。