如何找到空闲的TCP端口

问题描述 投票:0回答:4

如何在服务器上找到完全空闲的 TCP 端口?我已经尝试过命令行;

netstat -an

但我被告知那些状态为“聆听”的已经被使用了。

我还尝试了一个名为 TCPView 的工具,但它同样只显示正在使用的 TCP 端口。我知道如何远程登录到端口以检查其打开情况,但我需要找到一个免费的端口。

linux tcp port netstat
4个回答
8
投票

netstat -lntu

这将解决你的目的。


8
投票

灵感来自https://gist.github.com/lusentis/8453523

从种子端口开始,并增加它直到可用

BASE_PORT=16998
INCREMENT=1

port=$BASE_PORT
isfree=$(netstat -taln | grep $port)

while [[ -n "$isfree" ]]; do
    port=$[port+INCREMENT]
    isfree=$(netstat -taln | grep $port)
done

echo "Usable Port: $port"

4
投票

在 Bash 中,您可以编写简单的

for
循环来检查哪些 TCP 端口是空闲的,例如

$ for i in {1..1024}; do (exec 2>&-; echo > /dev/tcp/localhost/$i && echo $i is open); done
22 is open
25 is open
111 is open
587 is open
631 is open
841 is open
847 is open
1017 is open
1021 is open

有关更多信息,请查看:高级 Bash 脚本指南:第 29 章。

/dev
/proc


0
投票

基于@Fengzmg的答案:

本次实施:

  • 使用较新的
    ss
    而不是
    netstat
  • 不依赖于
    grep
    -ing 输出,而是使用
    ss
  • 中的过滤器接口
  • 更稳健,因为:
    • 我们仅匹配源端口 (
      sport
      ),而不是匹配目标端口的
      grep
      方法
    • 更好地支持少于 5 位数字的端口,因为我们不会匹配子字符串。
      grep
      方法将匹配
      443
      中的
      30443

注意:

-4
仅限于 IPv4。还有
-6
但您不能指定其中一个来匹配两者。

BASE_PORT=1234
INCREMENT=1

port=$BASE_PORT

while [ -n "$(ss -tan4H "sport = $port")" ]; do
  port=$((port+INCREMENT))
done

echo "Usable Port: $port"
© www.soinside.com 2019 - 2024. All rights reserved.