在Linux中不使用网络命令行的情况下,如何知道打开端口的列表以及拥有它们的进程?


11

我想知道嵌入式Linux中哪些进程使用了​​哪些端口。由于它是简单的嵌入式Linux,因此没有网络命令行,如netstat,lsof。(仅存在基本命令行,例如cat,cp,echo等)。

部分解决方案似乎是使用“ cat / proc / net / tcp”和“ cat / proc / net / udp”命令行。但是,我不确定这些命令行的打印列表是否显示了所有正在使用的端口,并且该列表没有显示哪个进程绑定到了特定端口

任何意见,将不胜感激。


我认为这个问题更适合Unix和Linux

Answers:


15

您应该能够在/proc/net/tcp和中找到所有打开的端口/proc/net/udp。每个文件都有一个inode列,可用于查找拥有该套接字的进程。

一旦有了inode编号,就可以运行ls命令,例如ls -l /proc/*/fd/* | grep socket:.$INODE使用该套接字查找进程。如果为不同的线程设置了具有不同文件描述符的进程,则可能需要扩展命令ls -l /proc/*/task/*/fd/* | grep socket:.$INODE到来查找所有线程。


1
find /proc -lname "socket:\[$INODE\]" 2> /dev/null
萨米奇

0

要查找任何端口的INODES,请执行以下命令

PORT=8080;cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | awk -F ":" '{print "PORT=" $2 ", INODE=" $3 }'

使用上面命令输出中的任何INODE来找到相关的PID,如下所示

find /proc -lname "socket:\[$INODE\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'

这里$ INODE是任何INODE的价值

在单行命令中,我们可以检查是否打开了任何端口并将其与任何PID关联,如下所示

PORT=8080;find /proc -lname "socket:\[$(cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | head -n 1 | awk -F ":" '{print $3}')\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'
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.