Linux命令获取未使用的端口

Linux命令获取未使用的端口

我正在寻找一个命令或脚本,它可以返回我的 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$TOcomm流程替代

第二个文件是端口的排序列表,我们通过调用命令获得该ss列表(-t表示 TCP 端口,-a表示全部 - 已建立并正在侦听 - 和-n数字 - 不尝试解析,例如,22ssh。然后我们只选择第四列awk,其中包含本地地址和端口。我们使用分隔cut符来拆分地址和端口:,并仅保留后者(-f2)。ss还输出一个标题,我们通过 ping 来摆脱grep不长于 5 的非空数字序列。然后我们通过数字方式()并使用摆脱重复项来遵守comm的要求。sort-nuniq

现在我们有一个开放端口的排序列表,我们可以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-uinss以获取免费的 UDP 端口。
  • shuf如果你对获取随机端口不感兴趣,请放弃

答案4

为了完整性,也可以使用 python 来查找端口。通过一行代码:

python -c "import socket; s = socket.socket(); s.bind(('', 0));print(s.getsockname()[1]);s.close()"

这里我们只需创建一个套接字并绑定到端口 0(这会让操作系统找到一个空闲端口)。然后我们打印该空闲端口并关闭我们的套接字,以便其他人可以使用该端口。

相关内容