命令
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
Local Address字段中冒号后面的数字表示正在使用的端口。如果状态为 “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以上的端口。
我自己编了一个【小名单】(http://adhocshare.blogspot.com/2012/10/find-list-of-open-ports-listening-ports.html)。
我最喜欢的一些是:。
netstat -tulpn
lsof -i -n -P
一个好的、可靠的检查端口打开的方法是使用ss
(替代 已废弃的 netstat
),它可以在脚本中使用,而不需要提升权限(即sudo
)。
用途:监听端口的选项-l
,绕过DNS解析的选项-n
,以及源端口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)
``` 0x1&