如何确保在shell中选择一个开放端口

时间:2017-06-09 13:57:01

标签: bash shell port

所以我有一个创建隧道的脚本。为此,它使用随机端口。 这是随机端口生成的逻辑

RPORT=1
while [ $RPORT -lt 2000 ]
        do
        RPORT=$[($RANDOM % 3000) + 1]
done

仅当它选择的端口未被使用时才有用。如果该端口处于活动状态,则在使用该端口时我无法访问该服务器。

我想做这样的事情

while [netsat -nat | grep $RPORT] = true
       do
       RPORT=$[($RANDOM % 3000) + 1]

所以我想首先检查该端口是否正在使用,如果是,请搜索另一个随机端口,检查是否正在使用,如果没有则使用它。

非常感谢您的时间和帮助!

2 个答案:

答案 0 :(得分:0)

function random_unused_port {
   (netstat --listening --all --tcp --numeric | 
    sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g' |
    sort -n | uniq; seq 1 1000; seq 1 65535
    ) | sort -n | uniq -u | shuf -n 1
}

RANDOM_PORT=$(random_unused_port)

这是帮助我的功能! 感谢Nahuel Fouilleul的链接!

答案 1 :(得分:0)

要解决问题,还要保留1到1000之间的端口,seq从1001开始

grep -F -x -v -f <(
    netstat --listening --all --tcp --numeric |
    sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g' |
    sort -nu
) <(seq 1001 65536) | shuf -n 1