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

时间:2014-02-20 02:51:09

标签: shell unix port netstat

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

3 个答案:

答案 0 :(得分:15)

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 :(得分:5)

假设您使用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表示列表 n 数据端口和所有 p rogram的IP l t b> cp端口。
  • a | b表示a与b
  • 的过程标准输出

例如

$ is_port_free 8080
yes

$ is_port_free 22
no

答案 2 :(得分:1)

简单的事情:

netstat -an|egrep '[0-9]:8080 .+LISTENING'