我正在寻找一个命令或脚本,它可以返回我的 ubuntu linux 系统上未使用的端口。我在网上搜索过,唯一找到的就是使用 nestat 命令获取已使用/监听端口的信息。显然 netstat 命令可以工作,但不知道具体是什么。有什么办法吗?
谢谢。
答案1
netstat -lat
给出完整列表聆听和已确立的端口。
当端口未打开时,系统中不存在任何状态,因此您将找不到显示未使用端口列表的命令。
请记住,有 65535 个端口,因此任何未打开的netstat -lat
端口都是未使用的端口。
以下 bash 脚本将对传输控制协议端口,并让你知道哪些是打开并且关闭:
#!/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 IP 第一个端口 最后一个端口,例如:./portscan.sh 127.0.0.1 20 135
将扫描本地设备从端口 20 到 135。记得使用 使其可执行chmod +x portscan.sh
。
答案2
Ruby 2.x (单行):
ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'
现在我的机器上打印了:
42644
随后打印出以下调用:
36168
此技术使当前用户请求未使用的端口(绑定到端口“0”),然后打印出操作系统提供的端口号。由于当前用户是请求者,因此不会返回低于 1024 的端口(除非当前用户 = root)。
功劳归功劳——这个解决方案来自于富兰克林在 unix.stackexchange.com 上查找未使用的本地端口的最简单方法是什么?
答案3
单行
我编写了一个很好的单行代码,可以快速达到目的,允许抓取任意范围内的任意数量的端口(这里为了便于阅读,将其分为 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
还输出一个标题,我们通过 ping 来摆脱grep
不长于 5 的非空数字序列。然后我们通过数字方式()并使用摆脱重复项来遵守comm
的要求。sort
-n
uniq
现在我们有一个开放端口的排序列表,我们可以shuf
使用它来获取第一个"$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
inss
以获取免费的 UDP 端口。 shuf
如果你对获取随机端口不感兴趣,请放弃
答案4
为了完整性,也可以使用 python 来查找端口。通过一行代码:
python -c "import socket; s = socket.socket(); s.bind(('', 0));print(s.getsockname()[1]);s.close()"
这里我们只需创建一个套接字并绑定到端口 0(这会让操作系统找到一个空闲端口)。然后我们打印该空闲端口并关闭我们的套接字,以便其他人可以使用该端口。