我通常使用fuser命令检查pid是否打开了某些tcp端口,如下所示
fuser 22/tcp //To get pid opening the 22 tcp port
我有一个运行嵌入式Linux的参考板.
它已经开放了22 tcp端口用于ssh连接.
但是热熔器不显示任何有关22端口的输出.
所以我尝试了另一个ssh守护进程来打开322端口,然后尝试使用热熔器检查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选项.)
解决方法:
我已经安装了/ proc并安装了bash和readlink,
您可以编写一个小的bash脚本来解析/ proc / net / tcp,然后扫描/ proc / * / fd /来找到相应的套接字.
我对嵌入式Linux不太熟悉,但是如果找不到readlink,它可能会包含在busybox中.
/ proc / net / tcp就像
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:4E7A 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 13128 1 ffff8800cf960740 99 0 0 10 0
local_address是HOST:PORT的十六进制字符串,因此当您要搜索tcp 22端口时,脚本将搜索:0016.
一旦找到在local_address中包含:0016的行,
索引节点是相应的套接字号.
然后,使用readlink命令搜索具有套接字号的/ proc / * / fd / *.
#!/bin/bash
PORT="$1"
HEX_PORT=$(printf %04X $PORT)
INODE=""
if ! [ "$PORT" ];then
echo "usage $0 [PORT]"
exit
fi
while read num host_port _ _ _ _ _ _ _ inode _; do
if [[ $host_port =~ :"$HEX_PORT"$]];then
INODE=$inode
fi
done < /proc/net/tcp
if ! [ "$INODE" ];then
echo "no process using $PORT"
exit
fi
for fn in /proc/[1-9]*/fd/*; do
if [ "$(readlink $fn)" = "socket:[$INODE]" ];then
tmp=${fn%/fd*}
echo ${tmp#/proc/}
fi
done
标签:netstat,ssh,fuser,linux
来源: https://codeday.me/bug/20191120/2042017.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。