找到一个范围内多个未使用的本地端口的最简单方法是什么?

时间:2019-08-01 11:47:18

标签: bash macos shell

我需要找到的未使用本地端口的范围应作进一步使用(对于appium节点)。我找到了以下代码:

getPorts() {
        freePort=$(netstat -aln | awk '
      $6 == "LISTEN" {
        if ($4 ~ "[.:][0-9]+$") {
          split($4, a, /[:.]/);
          port = a[length(a)];
          p[port] = 1
        }
      }
      END {
        for (i = 7777; i < 65000 && p[i]; i++){};
        if (i == 65000) {exit 1};
        print i
      }
    ')
    echo ${freePort}
}

如果我需要一个免费的端口,这很好用,但是对于并行测试执行,我们需要多个未使用的端口。因此,我需要修改该函数,以便从第一个找到的免费端口开始,然后将结果存储在一个String变量中,以获取一个(而不是一个)免费端口,而是多个(取决于参数)。例如,如果我需要三个3个设备的端口,则结果应为: 7777 7778 7779

该代码应可在macOS上运行,因为我们将Mac mini用作测试服务器。

由于我只是从bash开始,所以对我来说有点复杂

2 个答案:

答案 0 :(得分:1)

这是一个bash代码,在Linux上运行良好,因此,如果您的Mac也运行bash,它将为您工作。

getPorts() {
    amount=${1}
    found=0
    ports=""
    for ((i=7777;i<=65000;i++))
    do
        (echo > /dev/tcp/127.0.0.1/${i}) >/dev/null 2>&1 || {
            #echo "${i}"
            ports="${ports} ${i}"
            found=$((found+1))
            if [[ ${found} -ge ${amount} ]]
            then
                echo "${ports:1}"
                return 0
            fi
        }
    done

    return 1
}

这里是如何使用它和输出的信息:

$ getPorts 3
7777 7778 7779

$ getPorts 10
7777 7778 7779 7780 7781 7782 7783 7784 7785 7786

答案 1 :(得分:0)

从5000到5100查找未使用的端口:

range=(`seq 5000 5100`)
ports=`netstat -tuwan | awk '{print $4}' | grep ':' | cut -d ":" -f 2`
echo ${range[@]} ${ports[@]} ${ports[@]} | tr ' ' '\n' | sort | uniq -u