Bash 如何保证壳体中开口的选择

Bash 如何保证壳体中开口的选择,bash,shell,port,Bash,Shell,Port,所以我有一个脚本创建了一个隧道。为此,它使用随机端口。 这是随机端口生成的逻辑 RPORT=1 while [ $RPORT -lt 2000 ] do RPORT=$[($RANDOM % 3000) + 1] done 只有当它选择的端口未被使用时,这才是好的。如果该端口处于活动状态,则在使用该端口时,我无法访问该服务器 我想做这样的事情 while [netsat -nat | grep $RPORT] = true do RP

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

RPORT=1
while [ $RPORT -lt 2000 ]
        do
        RPORT=$[($RANDOM % 3000) + 1]
done
只有当它选择的端口未被使用时,这才是好的。如果该端口处于活动状态,则在使用该端口时,我无法访问该服务器

我想做这样的事情

while [netsat -nat | grep $RPORT] = true
       do
       RPORT=$[($RANDOM % 3000) + 1]
所以我想首先检查这个端口是否正在使用,如果是,搜索另一个随机端口,检查它是否正在使用,如果没有,然后使用它

提前非常感谢您的时间和帮助

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的链接

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

要解决这个问题,还因为从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

grep-F-x-v-F来修复答案,这也是因为从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

grep-F-x-v-F非常感谢您的链接!这个功能正是我所需要的
code
function random_unused_port{(netstat--listing--all--tcp--numeric | sed'1,2d;s/[^ space:]*[^[:space:]*[:space:]*[^[:space:]*[:space:]*:([0-9]*[:space:]*./\1/g';sort-n |排序-n | uniq;seq;seq 1 1000;seq 1 65535)][排序-n | uniq}未使用的端口|
code
非常感谢您的链接!这个功能正是我所需要的
code
function random_unused_port{(netstat--listing--all--tcp--numeric | sed'1,2d;s/[^ space:]*[^[:space:]*[:space:]*[^[:space:]*[:space:]*:([0-9]*[:space:]*./\1/g';sort-n |排序-n | uniq;seq;seq 1 1000;seq 1 65535)][排序-n | uniq}未使用的端口|
code
注意:我没有提到这个答案,我也不认为这是意料之中的,因为
seq 1 65535
将生成所有端口,然后
sort-n | uniq-u
(或更短的
sort-nu
)将与其他列表合并(?)注意:我没有提到这个答案,我也不认为它是预期的,因为
seq 1 65535
将生成所有端口,然后
sort-n | uniq-u
(或更短的
sort-nu
)将与其他列表合并(??)谢谢你,Nahuel!这就是我对端口范围所做的,我确实将它从20000设置为65536,所以它不会使用保留的端口。插入grep命令有什么区别?
grep-F-x-v-F
。谢谢grep-v做的是第二个集合减去第一个集合,而在另一个答案中,它是一个并集,可以返回1到65536之间的任何端口。谢谢,Nahuel!这就是我对端口范围所做的,我确实将它从20000设置为65536,所以它不会使用保留的端口。插入grep命令有什么区别?
grep-F-x-v-F
。谢谢grep-v是第二个集合减去第一个集合,而在另一个答案中,它是一个并集,可以返回1到65536之间的任何端口