如何在 /proc/fd 中找到有关套接字文件的更多信息?

ben*_*hsu 54 networking proc socket

查看/proc/$mypid/fd/,我看到这些文件

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]
Run Code Online (Sandbox Code Playgroud)

因为我可以访问代码,所以我知道这些套接字与 TCP 连接相关(一个是连接到某台机器上的端口 5672,另一个连接到其他机器上的端口 3306),但我想知道哪个套接字是绑定到哪个连接。我怎样才能做到这一点?

更一般地说,我如何向操作系统询问套接字的另一端是什么?

pid*_*idi 64

命令 lsof

一个不错的选择可能是lsof。正如man lsof所述,它对于获取有关 的信息非常方便open files such as Internet sockets or Unix Domain sockets


使用它

首先,大致了解一下/proc/$PID/fd/列出的套接字编号。
例如,socket:[14240]您可能会感兴趣。

然后使用lsof -i -a -p $PID打印所有网络文件$PID使用的列表。

  • -i 生成属于用户或进程的网络文件列表

  • -a 逻辑组合或 AND 的给定参数

  • -p $PID 仅选择有关您的过程的信息

使用 PID 运行的浏览器的典型输出2543可能是:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)

以及更多类似的线路。

伟大的!现在仔细查看该DEVICE列。它匹配我们之前列出的来自/proc/$PID/fd/!
多亏了这一NAME节,我们可以说我们插座的另一端是什么。

在实际运行中,您可能会获得大量输出,但只需过滤或grep针对您感兴趣的套接字即可。

我很确定可以组合所有命令,但这应该足以让您入门。

  • 好吧,我想:你需要用“-U”替换 lsof 命令的“-i”选项。即您使用“sudo lsof -U -a -p $(pidof wpa_supplicant)”。不幸的是,组合“-i”似乎不起作用,因此必须在搜索套接字文件时运行这两个命令。但事实证明还有更好的方法!您必须使用`ss -apn | grep your_socket` — 与 `lsof` 不同,`ss` 命令显示所有类型的套接字,除非您明确限制它。 (3认同)
  • “unix 0xfff ...”似乎是 unix_sock 结构的内核内存地址。这个结构包含一个指向你的套接字端点的指针。看看`grep -rni ffff88002704d380 /proc`。在 /proc/ 下的某处可能是你的答案,`cat` 你的文件 grep 找到了。但是不要把我固定在这个......这里可能是可怕的错误。 (2认同)
  • `lsof` 根据套接字类型从`/proc/net/tcp`、`/proc/net/tcp6`、`/proc/net/udp` 等读取有关套接字的其他信息。 (2认同)