我正在寻找一个命令或脚本来返回我的ubuntu linux系统上未使用的端口。我在互联网上看过,唯一发现的是关于nestat命令的二手/监听端口。显然,使用netstat命令可以执行某些操作,但不知道具体是什么。任何想法如何?
谢谢。
我正在寻找一个命令或脚本来返回我的ubuntu linux系统上未使用的端口。我在互联网上看过,唯一发现的是关于nestat命令的二手/监听端口。显然,使用netstat命令可以执行某些操作,但不知道具体是什么。任何想法如何?
谢谢。
Answers:
netstat -lat
给出侦听和已建立端口的完整列表。
当端口不在一个端口上时,系统将不存在任何这些状态,因此您将找不到显示未使用端口列表的命令。
请记住,有65535个端口,因此所有未打开netstat -lat
的端口都是未使用的端口。
以下bash脚本将对tcp端口进行简单扫描,并让您知道哪些是打开的,哪些是关闭的:
#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner
{
for ((port=$first_port; port<=$last_port; port++))
do
(echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
done
}
scanner
如果将其另存为portscan.sh,则必须以./portscan.sh IP IP first_port last_port运行,例如:./portscan 127.0.0.1 20 135
将从端口20到135扫描本地设备
Ruby 2.x(单线):
ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'
现在在我的机器上打印:
42644
随后的调用打印:
36168
此技术使当前用户请求一个未使用的端口(绑定到端口“ 0”),然后打印出操作系统提供的端口号。并且由于当前用户是询问的用户,因此不会返回低于1024的端口(除非当前用户= root)。
应归功于信用-此解决方案来自于Franklin Yu在unix.stackexchange.com上的评论“ 找到未使用的本地端口的最简单方法是什么?
我整理了一个很好的单行代码,可以快速实现此目的,允许在任意范围内抓取任意数量的端口(此处为了可读性将其分为4行):
comm -23 \
<(seq "$FROM" "$TO") \
<(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep '[0-9]\{1,5\}' | sort -n | uniq) \
| 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
对数字(-n
)进行编码,并使用来消除重复项,从而满足的要求uniq
。
现在我们的开放端口排序列表,我们可以shuf
FLE来再抢第一"$HOWMANY"
的人用head -n
。
抓住私有范围内的三个随机开放端口(49152-65535)
comm -23 <(seq 49152 65535) <(ss -tan | awk '{print $4}' | cut -d':' -f2 | grep "[0-9]\{1,5\}" | sort | uniq) | shuf | head -n 3
例如可以返回
54930
57937
51399
-t
用-u
in 切换ss
以获得免费的UDP端口。shuf
如果您对获取随机端口不感兴趣,请丢弃我只需要找到一个随机的未使用端口,而不打印它们的列表。这是我的bash解决方案。
#/bin/bash
function random_unused_port {
local port=$(shuf -i 2000-65000 -n 1)
netstat -lat | grep $port > /dev/null
if [[ $? == 1 ]] ; then
export RANDOM_PORT=$port
else
random_unused_port
fi
}
random_unused_port
并通过采购来使用它
$ . ./random_unused_port.sh; echo $RANDOM_PORT
也许是另一个基于已使用端口列表的解决方案:
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)
该netstat
命令生成所有打开的端口的列表。该sed
命令提取正在使用的端口号,sort
/ uniq
构造返回唯一的开放端口列表。第二步是生成从1开始到1000的端口号列表(保留的端口),以及从1到65535的所有端口号的附加列表。最终列表仅包含所有可用端口一次,并且uniq -u
将提取它们。 。最后,shuf -n 1
将从可用端口的完整列表中随机选择一个端口。但是,在保留港口之前,将出现竞争状况。
我需要从端口号开始查找下一个打开的端口。这是我使用@Taras解决方案的尝试。
_check="placeholder"
START_FROM=1900
PORT=$(( ( "$RANDOM" % 1000 ) + $START_FROM ))
while [[ ! -z "${_check}" ]]; do
((PORT++))
_check=$(ss -tulpn | grep ":${PORT}")
done