Linux 命令获取未使用的端口

use*_*082 24 linux port command-line

我正在寻找一个命令或脚本,它在我的 ubuntu linux 系统上返回一个未使用的端口。我在互联网上查看过,我发现的唯一一件事是关于使用 nestat 命令的 used/Listen 端口。显然,使用 netstat 命令可以工作,但不知道究竟是什么。知道怎么做吗?

谢谢。

jcb*_*rmu 15

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
Run Code Online (Sandbox Code Playgroud)

如果你把它保存为portscan.sh那么它必须作为./portscan.sh IP first_port last_port运行,例如:./portscan 127.0.0.1 20 135将从端口 20 到 135 扫描本地设备


G. *_*ies 8

Ruby 2.x(单行):

ruby -e 'require "socket"; puts Addrinfo.tcp("", 0).bind {|s| s.local_address.ip_port }'

现在在我的机器上打印:

42644
Run Code Online (Sandbox Code Playgroud)

随后的调用打印:

36168
Run Code Online (Sandbox Code Playgroud)

这种技术使当前用户请求一个未使用的端口(绑定到端口“0”),然后打印出操作系统提供的端口号。并且由于当前用户是请求者,因此不会返回低于 1024 的端口(除非当前用户 = root)。

信用到期 - 此解决方案来自Franklin Yu在 unix.stackexchange.com 上的评论找到未使用的本地端口的最简单方法什么?


小智 6

单线

我整理了一个很好的单行代码,可以快速达到目的,允许抓取任意范围内的任意数量的端口(为了便于阅读,这里将其分为 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"
Run Code Online (Sandbox Code Playgroud)

逐行

comm是一个比较两个文件中排序行的实用程序。它输出三列:仅出现在第一个文件中的行、仅出现在第二个文件中的行和公共行。通过指定,-23我们抑制后面的列,只保留第一列。我们可以用它来获得两个集合的差异,表示为文本行序列。我是在comm 这里了解到的。

第一个文件是我们可以选择的端口范围。生成从到 的seq已排序数字序列。使用进程替换将结果作为第一个文件通过管道传输。$FROM$TOcomm

第二个文件是经过排序的端口列表,我们通过调用ss命令获得该列表(-t表示 TCP 端口,-a表示所有 - 已建立和正在侦听 - 以及-n数字 - 不尝试解析,例如,22to ssh)。然后,我们仅选择第四列awk,其中包含本地地址和端口。我们使用分隔符cut来分割地址和端口:,只保留后者(-f2)。还输出一个标头,我们通过ping 不超过 5 的非空数字序列来ss消除该标头。然后,我们通过数字 ing ( ) 并使用 消除重复项来遵守的要求。grepcommsort-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
Run Code Online (Sandbox Code Playgroud)

例如可以返回

54930
57937
51399
Run Code Online (Sandbox Code Playgroud)

笔记

  • 改为-t使用-uinss来获取空闲的 UDP 端口。
  • shuf如果您对获取随机端口不感兴趣,请删除


小智 5

简短的 bash 脚本,随机生成 1025 到 60000 之间的数字并循环,直到在已用端口列表中找不到该数字。这是一个快速但肮脏的解决方案,偏向于较大的端口:

CHECK="do while"

while [[ ! -z $CHECK ]]; do
    PORT=$(( ( RANDOM % 60000 )  + 1025 ))
    CHECK=$(sudo netstat -ap | grep $PORT)
done

echo $PORT
Run Code Online (Sandbox Code Playgroud)