读取“/proc”以了解进程是否已打开端口

rmo*_*njo 21 linux open-files tcp proc

我需要知道具有给定 PID 的进程是否在不使用外部命令的情况下打开了一个端口。然后我必须使用/proc文件系统。/proc/$PID/net/tcp例如,我可以读取文件并获取有关进程打开的 TCP 端口的信息。但是,在多线程进程上,该/proc/$PID/task/$TID目录还将包含一个net/tcp文件。我的问题是:

我需要查看所有线程net/tcp文件,还是将线程打开的端口写入进程net/tcp文件。

lar*_*sks 28

例如,我可以读取 /proc/$PID/net/tcp 文件并获取有关进程打开的 TCP 端口的信息。

该文件不是进程打开的 tcp 端口列表。这是在当前网络命名空间所有打开的TCP端口的列表,并在同一个网络的命名空间运行的进程是相同的,以内容/proc/net/tcp

要查找进程打开的端口,您需要从 中获取套接字描述符列表/proc/<pid>/fd,然后将这些描述符与 的inode字段匹配/proc/net/tcp

  • @rmonjo 线程无法打开文件,只有进程可以。线程的 `fd` 目录只是重复进程的 `fd` 目录。 (8认同)

小智 13

cat /proc/$PID/net/tcp
Run Code Online (Sandbox Code Playgroud)

你会得到这样的输出

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  0: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 2891985097 1 0000000000000000 100 0 0 10 0
Run Code Online (Sandbox Code Playgroud)

输出的第二列 ( local_address) 以十六进制显示端口。使用编程计算器将十六进制代码转换为十进制。

例如,端口 :01BB(十六进制)等于 443(十进制),这是 HTTPS 默认端口。