Linux命令获取未使用的端口


20

我正在寻找一个命令或脚本来返回我的ubuntu linux系统上未使用的端口。我在互联网上看过,唯一发现的是关于nestat命令的二手/监听端口。显然,使用netstat命令可以执行某些操作,但不知道具体是什么。任何想法如何?

谢谢。



1
为什么您需要这样做呢?如果正在开发服务器,则可以绑定到端口0,并且操作系统将为您分配一个空闲端口,您无需进行任何搜索。否则,搜索然后绑定很容易产生竞争条件。例如见stackoverflow.com/questions/1365265/...stackoverflow.com/questions/1075399/...
帕特里克Mevzek

Answers:


14

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扫描本地设备


7

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上的评论“ 找到未使用的本地端口的最简单方法什么?


如何在bash脚本中将结果分配给变量?
尼尔·史蒂文斯

export PORT = $(ruby -e'require“ socket”; puts Addrinfo.tcp(“”,0).bind {| s | s.local_address.ip_port}')
G. Sylvie Davies

3

简短的bash脚本,它会随机生成一个介于1025和60000之间的数字,并循环播放,直到在使用的端口列表中找不到该数字为止。这是一个快速的'n肮脏解决方案,它偏向更大的端口:

CHECK="do while"

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

echo $PORT

检查您的grep命令,查看有关adarshr答案的评论
尼克

2

一线

我整理了一个很好的单行代码,可以快速实现此目的,允许在任意范围内抓取任意数量的端口(此处为了可读性将其分为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还会输出一个标头,通过grepping长度不超过5的非空数字序列,可以消除该标头。然后,comm通过sort对数字(-n)进行编码,并使用来消除重复项,从而满足的要求uniq

现在我们的开放端口排序列表,我们可以shufFLE来再抢第一"$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-uin 切换ss以获得免费的UDP端口。
  • shuf如果您对获取随机端口不感兴趣,请丢弃

1
我喜欢您的单行代码,此版本可正确解析IPv6,例如[:: 1]:52792并使用--no-header选项而不是grep。gist.github.com/fstefanov/ff4dcec7ded59514421bf944d1bb9a6f
Filip Stefanov

1

我只需要找到一个随机的未使用端口,而不打印它们的列表。这是我的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

我喜欢这里的想法,但是您的grep命令不会返回您想要的。这样做的好处是保守,但是如果下一个随机端口是2000,并且端口2000已打开,但端口20000正在使用中,它将继续查找,因此结果将不是可用端口的全部范围。
尼克

1

也许是另一个基于已使用端口列表的解决方案:

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将从可用端口的完整列表中随机选择一个端口。但是,在保留港口之前,将出现竞争状况。


1

我需要从端口号开始查找下一个打开的端口。这是我使用@Taras解决方案的尝试。

_check="placeholder"
START_FROM=1900
PORT=$(( ( "$RANDOM" % 1000 ) + $START_FROM ))
while [[ ! -z "${_check}" ]]; do
    ((PORT++))
    _check=$(ss -tulpn | grep ":${PORT}")
done

0

如果54321是您的端口,请运行:

sudo netstat -ap |grep 54321

此处可以找到使用netstat的一些变体。


该命令仅在端口54321是否使用时才显示。我要查找的是未使用的端口。
user2429082 2015年

未使用是模棱两可的。您要检查哪个端口可以收听?还是可以连接哪个端口?任何未使用的都可用。作为用户,你可以使用1024以上的,如根,你也可以使用那些在1024
主宰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.