我通常使用fuser命令检查pid打开某个tcp端口,如下所示
fuser 22/tcp //To get pid opening the 22 tcp port
我有一个运行嵌入式linux的参考板 . 它已经为ssh连接打开了22个tcp端口 . 但是热熔器不显示任何关于22端口的输出 . 所以我尝试了另一个ssh守护进程打开322端口,然后尝试使用fuser检查pid,它运行正常 .
root@imx6qsabreauto:~# netstat -nlt | grep 22
tcp 0 0 0.0.0.0:4224 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:322 0.0.0.0:* LISTEN
tcp 0 0 :::322 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
root@imx6qsabreauto:~# fuser 322/tcp
351
root@imx6qsabreauto:~# ps -ef | grep 351
root 351 1 0 01:46 ? 00:00:00 /usr/sbin/dropbear -r /etc/dropbear/dropbear_rsa_host_key -p 322 -B
root 379 315 0 02:11 ttymxc3 00:00:00 grep 351
root@imx6qsabreauto:~# fuser 22/tcp
==> This output nothing !!
我怎样才能确定哪个进程正在打开tcp 22端口 . (在主板中,lsof命令不可用,并且.. netstat没有-p选项 . )
3 回答
我安装了
/proc
并安装了bash
和readlink
,您可以编写一个解析/proc/net/tcp
的小bash脚本,并扫描/proc/*/fd/
以查找相应的套接字 .我对嵌入式linux不太熟悉,但是如果你找不到
readlink
,它可能会包含在busybox
中 ./proc/net/tcp
是这样的local_address
是HOST:PORT
的十六进制字符串,因此当您要搜索tcp 22端口时,脚本会搜索:0016
.一旦它在
local_address
中找到包含:0016
的行,inode
就是相应的套接字号 .然后它使用
readlink
命令搜索具有套接字号的/proc/*/fd/*
.谢谢@ymonad !! :)正如你提到的,我已经能够获得对应于端口的pid,如下所示 .
你的shell脚本工作正常,它可以正常得到pid,如下所示 .
奇怪的是结果pid是1.它是init进程;;
我想我需要弄清楚init进程如何打开22 tcp端口 . 真的很谢谢你 . :D我学到了很多东西 . 再次感谢 !!
这是在Tomato / BusyBox路由器上运行的ymonad脚本的一个版本: