Bash 什么';在一个范围内查找多个未使用的本地端口的最简单方法是什么?
我需要的是找到具有进一步使用范围的未使用的本地端口(对于appium节点)。我发现这个代码: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
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