如何检查Linux计算机上哪些端口繁忙和哪些端口空闲?


Answers:


41

命令

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地址上被接受-因此,这意味着来自计算机外部的连接。

如果它说localhost127.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以上的端口。


这意味着传入的连接将在分配给接口的任何IP地址上被接受-因此,这意味着来自机器外部的连接是否在这里出错?您可能是说,如果连接来自分配给给定接口的任何地址,无论它们来自何处,都将被接受。传入连接的来源可能在下一列“外部地址”中指定。因此就在这里,如果值为0.0.0.0,则意味着可以从任何地方(包括在机器外部)接受连接
user907860

1
@ user907860可能不清楚,但是我要区分的是0.0.0.0与127.0.0.1之间-后者将仅接受来自您计算机的连接,因为它正在侦听未路由的IP地址。其中0.0.0.0表示您机器上的任何地址,因此,只要路由了它们,就可以从其他机器建立连接。
保罗

仅供参考,-antu可以写成-tuna🐟
Abdennour•图米


7

一种很好且可靠的检查打开的端口的方法是使用ss(替换已弃用的 端口netstat),它可以在脚本中使用,而无需提升特权(即sudo)。

用法:-l用于侦听端口的选项,-n用于绕过DNS解析的选项以及源端口NN:上的筛选器src :NNNN由要监视的端口代替)。有关更多选项,请参见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)

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.