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

max*_*max 3 unix shell port netstat

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

ajk*_*ajk 16

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
Run Code Online (Sandbox Code Playgroud)

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

if ! lsof -i:8080
then
    echo 8080 is free
else
    echo 8080 is occupied
fi
Run Code Online (Sandbox Code Playgroud)


Яро*_*лин 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
}
Run Code Online (Sandbox Code Playgroud)
  • $ {1:-8080}表示将第一个参数用作端口,如果没有第一个参数,则使用8080
  • grep -q [0-9]:port表示匹配数字,后跟冒号,然后是端口
  • $?是上一个命令的退出值。零表示一切顺利。退出值大于0表示错误情况。在grep上下文中,退出代码1表示不匹配。-q表示除了返回退出值外什么也不做。
  • netstat的-ltnp手段名单ñ umeric端口和IP地址的所有p rograms是 istening一个上牛逼 CP端口。
  • 一个| b表示使用b处理a的标准输出

例如。

$ is_port_free 8080
yes

$ is_port_free 22
no
Run Code Online (Sandbox Code Playgroud)