Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 什么';在一个范围内查找多个未使用的本地端口的最简单方法是什么?_Bash_Macos_Shell - Fatal编程技术网

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

Bash 什么';在一个范围内查找多个未使用的本地端口的最简单方法是什么?,bash,macos,shell,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

我需要的是找到具有进一步使用范围的未使用的本地端口(对于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}
}

getPorts(){
自由港=$(netstat-aln | awk'
$6==“听”{
如果($4~“[.:][0-9]+$”){
拆分($4,a,/[:]/);
端口=a[长度(a)];
p[端口]=1
}
}
结束{
对于(i=7777;i<65000&&p[i];i++{};
如果(i==65000){exit 1};
打印i
}
')
echo${freePort}
}
如果我需要一个空闲端口,那么这很好,但是对于并行测试执行,我们需要多个未使用的端口。因此,我需要修改函数,使其能够从第一个找到的自由端口开始,而不是获得一个自由端口,而是多个(取决于参数),然后将结果存储在一个字符串变量中。例如,如果我需要三个3设备的端口,结果应该是: 777777787779

代码应该在macOS上运行,因为我们使用MacMini作为测试服务器


因为我刚开始使用bash,对我来说这有点复杂,这是一个
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
}

查找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

谢谢@Azize,按预期工作!有一个问题,你能解释一下这是为什么吗
if[${found}-ge${amount}]
检查所需的端口数量是否等于或大于找到的端口数量。否则它将不会停止并显示所有可用端口。将所有端口作为一个字符串变量(如7777 7778 7779等)放在一行中的最佳方式是什么?谢谢,这非常有用!阿齐兹的建议对我来说是最好的选择。但是我有一个关于如何解析结果字符串的问题?结果是一个字符串:7777787779。我需要的是遍历这个字符串并逐个获取端口。我尝试的是:
for((I=0;i@DimaZeuge:脚本的工作方式:在所需范围内定义一个数字数组。定义一个已使用端口数组。获取这两个数组的
diff
。@dimazuge:关于您的问题,将字符串放在括号中,它将成为一个数组。然后迭代该数组。
range=(`seq 5000 5100`)
ports=`netstat -tuwan | awk '{print $4}' | grep ':' | cut -d ":" -f 2`
echo ${range[@]} ${ports[@]} ${ports[@]} | tr ' ' '\n' | sort | uniq -u