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

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

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

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

任何意见将不胜感激。

答案1

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

获得索引节点号后,您可以运行 ls 命令,例如ls -l /proc/*/fd/* | grep socket:.$INODE查找使用该套接字的进程。如果一个进程为不同的线程设置了不同的文件描述符,您可能需要扩展该命令ls -l /proc/*/task/*/fd/* | grep socket:.$INODE才能找到所有文件描述符。

答案2

要查找任何端口的 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}'

相关内容