如何确定端口是否正在使用,例如通过netstat?

3

我正在尝试使用shell脚本检查端口是否可用并获取返回值。例如:如果端口8080可用,则返回true,否则返回false。有人可以帮忙吗?我已经尝试使用netstat

3个回答

18

lsof 是你的好朋友:

# lsof -i:8080      # free on my machine
# echo $?
1
# lsof -i:5353      # occupied
COMMAND   PID           USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mDNSRespo  64 _mdnsresponder    8u  IPv4 0x9853f646e2fecbb7      0t0  UDP *:mdns
mDNSRespo  64 _mdnsresponder    9u  IPv6 0x9853f646e2fec9cf      0t0  UDP *:mdns
# echo $?
0

因此,在脚本中,您可以使用来否定值以测试可用性:

if ! lsof -i:8080
then
    echo 8080 is free
else
    echo 8080 is occupied
fi

1
还可以将lsof的输出重定向到/dev/null,使其更具“脚本化”。 - ivant
也许使用 grep 查找 LISTEN 会很有用。类似这样的语句 if ! lsof -i:8080 | grep LISTEN > /dev/null。如果您既有一个本地运行的服务器,又有一个外部连接,那么这可能非常有用。例如,您连接到远程 MySQL 服务器,同时还有一个本地 MySQL 服务器在运行。外部连接将显示为 ESTABLISHED。如果您只想知道是否有正在使用的本地端口,则需要过滤掉这些连接。 - wsams
可以使用lsof -i:8080 -sTCP:LISTEN > /dev/null来代替使用 grep 进行过滤。 - gentooboontoo

4
假设您正在使用net-tools中的netstat,这是一个可用的示例:
function is_port_free { 

    netstat -ntpl | grep [0-9]:${1:-8080} -q ; 

    if [ $? -eq 1 ]
    then 
        echo yes 
    else 
        echo no
    fi
}
  • ${1:-8080} 表示使用第一个参数作为端口,如果没有第一个参数,则使用8080端口。
  • grep -q [0-9]:port 表示匹配数字后跟冒号,然后是端口。
  • $? 是上一个命令的退出值。零表示一切正常。大于0的退出值表示错误条件。在grep的上下文中,退出代码1表示没有匹配。-q表示不执行任何操作,只返回退出值。
  • netstat -ltnp 表示列出所有正在监听tcp端口的程序的数字端口和IP地址。
  • a | b 表示将a的标准输出用于b处理。

例如:

$ is_port_free 8080
yes

$ is_port_free 22
no

1
如何尝试一些简单的东西:
netstat -an|egrep '[0-9]:8080 .+LISTENING'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接