是否有任何命令行命令或任何其他方式来查找并列出Linux机器上的繁忙和空闲端口号?
是否有任何命令行命令或任何其他方式来查找并列出Linux机器上的繁忙和空闲端口号?
Answers:
命令
netstat -antu
将显示所有正在使用的tcp和udp端口。输出将如下所示:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN
本地地址字段中冒号后面的数字表示正在使用的端口。如果状态为“ LISTEN”,则表示端口用于传入连接。如果该Local Address
字段中的IP地址是,0.0.0.0
则意味着传入的连接将在分配给接口的任何IP地址上被接受-因此,这意味着来自计算机外部的连接。
如果它说localhost
或127.0.0.1
将只接受来自您的计算机的连接。
此外,如果添加-p
参数并以root用户身份运行,它将显示打开端口的过程:
$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:59753 0.0.0.0:* LISTEN 860/rpc.statd
任何未显示为正在使用的东西都是免费的,但是用户(非特权帐户)只能打开1023以上的端口。
-antu
可以写成-tuna
🐟
一种很好且可靠的检查打开的端口的方法是使用ss
(替换已弃用的 端口netstat
),它可以在脚本中使用,而无需提升特权(即sudo
)。
用法:-l
用于侦听端口的选项,-n
用于绕过DNS解析的选项以及源端口NN
:上的筛选器src :NN
(NN
由要监视的端口代替)。有关更多选项,请参见man ss
ss -ln src :NN
例子:
[user@server ~]# ss -ln src :80
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
[user@server ~]# ss -ln src :81
State Recv-Q Send-Q Local Address:Port Peer Address:Port
在脚本中,使用grep,我们可以测试输出是否包含我们请求的端口。使用端口80的示例(请参见上文):
myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
echo "Port $myport is in use (result == $result) "
else
echo "Port $myport is NOT in use (result == $result) "
fi
# output:
Port 80 is in use (result == 1)
未使用端口81的示例(请参见上文)
myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
echo "Port $myport is in use (result == $result) "
else
echo "Port $myport is NOT in use (result == $result) "
fi
# output:
Port 81 is NOT in use (result == 0)
其它的办法:
telnet localhost <PORT_NUMBER>
如果端口空闲,则会出现错误。如果端口在使用中,则telnet将连接。