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


13

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

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

Answers:


23

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

该文件不是该进程打开的tcp端口的列表。它是当前网络名称空间中所有打开的tcp端口的列表,对于在同一网络名称空间中运行的进程,其内容与相同/proc/net/tcp

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


谢谢您的回答。如果该进程是多线程的,是否需要遍历fd每个线程的所有目录?还是/proc/pid/fd目录“继承” /proc/pid/task/tid/fd目录?
rmonjo

我不确定,但这似乎很容易测试。
larsks'Aug

8
@rmonjo线程无法打开文件,只有进程可以。该fd线程的目录只是重复fd过程的目录。
吉尔斯(Gilles)'所以

0

cat /proc/$PID/net/tcp

你会得到这样的输出

  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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.