一线
我整理了一个很好的单行代码,可以快速实现此目的,允许在任意范围内抓取任意数量的端口(此处为了可读性将其分为4行):
comm -23 \
<(seq "$FROM" "$TO" | sort) \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -u) \
| shuf | head -n "$HOWMANY"
逐行
comm
是一种实用程序,用于比较必须按字母顺序显示的两个文件中的行。它输出三列:仅出现在第一个文件中的行,仅出现在第二个文件中的行和公共行。通过指定,-23
我们取消后面的列,而仅保留第一列。我们可以使用它来获得两组差异,以文本行序列表示。我了解到comm
这里。
第一个文件是我们可以选择的端口范围。seq
产生从$FROM
到的排序数字序列$TO
。结果按字母顺序(而不是数字)排序,并comm
使用流程替换通过管道传递到第一个文件。
第二个文件是我们通过调用ss
命令获得的端口的排序列表(-t
含义为TCP端口,-a
意味着所有端口(已建立并正在侦听)以及-n
数字端口-请勿尝试解析22
为ssh
)。然后,我们仅选择带有的第四列awk
,其中包含本地地址和端口。我们使用分隔符cut
分割地址和端口,:
仅保留后者(-f2
)。ss
还会输出一个标头,通过grep
ping不大于5的非空数字序列可以消除此标头。然后,comm
通过sort
ing不重复来满足的要求-u
。
现在我们的开放端口的排序列表,我们可以shuf
FLE来再抢第一"$HOWMANY"
的人用head -n
。
例
抓住私有范围内的三个随机开放端口(49152-65535)
comm -23 <(seq 49152 65535 | sort) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort -u) | shuf | head -n 3
例如可以返回
54930
57937
51399
笔记
-t
用-u
in 切换ss
以获得免费的UDP端口。
- 更换
shuf
用sort -n
,如果你喜欢得到随机可用端口数字顺序排序,而不是
-n
netstat和更具选择性的grep)。这样做的方法是尝试以所需的任何模式打开端口,如果端口不可用,则尝试另一个端口。