仅在Bash中,如何通过绑定到端口0来检索两个保证可用的开放端口号,就像在其他语言(Perl或Python)中一样?我的操作系统是Ubuntu 16.04 LTS。
我见过perl和python的例子,但没有使用单独的语言就没有用。
我的最终目标是替换以下不可靠的脚本,因此我可以将结果分配给变量并稍后在我的脚本中使用它们
count=0;
for i in {11212..12655}
do
netstat -ntpl | grep [0-9]:${1:-$i} -q ;
if [ $? -eq 1 ]; then
aLen=${#PORTS[@]};
#echo $i:$?
if [ $aLen -lt 2 ]; then
PORTS[$count]=$i;
((count++));
else
break;
fi;
fi;
done
PORTs1="${PORTS[0]}";
PORTs2="${PORTS[1]}";
答案 0 :(得分:2)
结束使用Python来获得我需要的东西。
PORT1=$(python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()');
PORT2=$(python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()');
答案 1 :(得分:0)
因为您的目标是为PORTs1
和PORTs2
变量分配两个保证免费的端口号,以便它们可以在以后的某个时间点绑定,< em>这本质上是不可能的。
绑定到端口0的整个原因是它允许操作系统选择一个在操作本身时立即可用的端口。如果在之前选择端口号,则打开它,然后您创建了一个窗口,其中另一个进程可以绑定到该端口。相比之下,如果在启动最终需要拥有侦听套接字的程序之前绑定到端口,则它不再是空闲的。
传递一个预先绑定到端口的文件描述符 - 而不是传递一个端口号以便以后绑定到 - 是可能的(尽管不使用保证存在于bash中的shell内置功能),但它是要求重写你正在调用的程序;如果您打算这样做,您也可以重写该程序,要求操作系统随机选择其端口号,并以可用的格式将其写出来。