【问题标题】:Cross-platform check for port in use跨平台检查正在使用的端口
【发布时间】:2020-03-04 12:21:08
【问题描述】:

我正在寻找一种跨平台的方法来检查端口是否正在使用,以便打印警告消息。

我已经在 macOS 中完成了这个:

if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null; then
  echo "Port 8080 is already in use"
fi

但是这个 bash 脚本也需要在 Windows 机器上运行。我在看类似netstat -aon | find "8080" 的东西,但我不确定如何在我的脚本中使用它(没有 Windows 机器)。

有没有一种有效的方法来做到这一点?如果有帮助,Windows 机器可以使用 WSL(但 work yet 似乎没有 lsof)。

【问题讨论】:

  • 批处理脚本不是跨平台的。你为什么要这个?
  • Bash,而不是 Batch :) 我还更新了我的帖子以注意 WSL 的存在

标签: windows bash macos port windows-subsystem-for-linux


【解决方案1】:

虽然我确信其他答案在某些情况下会起作用,但我只是想指出,我最终为自己的工作采用了以下解决方案:

if echo PING | nc localhost 8080 >/dev/null; then
  echo "Port 8080 in use"
fi

【讨论】:

  • 这已经内置在 Netcat 中,带有一个特殊用途的标志!只需执行nc -z localhost 8080。也不会建立连接,它只会检查端口是否打开。
【解决方案2】:

我不确定您的网络是什么样的,但也许 nmap 会是您的解决方案。您可以仅使用 linux 扫描本地网络中每台 pc 的端口。 如果端口打开,则表示正在使用中。此解决方案适用于任何系统。

apt-get install nmap

例如这样:

if nmap -p 8080 <ip address> | grep -wq "open"
then
    echo "Port 8080 is already in use"
fi

【讨论】:

    【解决方案3】:

    使用netstat(适用于 windows、mac、wsl2)

    例如netstat -a | grep :8080,其中 8080 是您感兴趣的端口。

    如果您在 wsl1 上,则需要使用 windows netstat,因为 wsl 中包含的 netstat 已损坏。只需在使用之前为 windows netstat 设置一个别名alias netstat='/mnt/c/Windows/System32/netstat.exe'

    【讨论】:

    • 谢谢!我只是试了一下,它似乎挂了很长一段时间——最多 30 秒。这仅仅是因为有很多端口要检查吗?有什么办法可以加快速度吗?
    • 这可能与名称解析有关尝试使用标志-an 这样您就只显示数字形式
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多