我目前的设置是,我有多个 Raspberry pi 通过网络交换机连接到我的笔记本电脑。没有一个 pi 连接到互联网。我想向所有 pi 广播使用摄像头的命令,因此想通过 Windows 上的 Ubuntu 使用 Terminator。
如果我使用 PowerShell 通过 ssh 进入 pi ssh -X pi[i]@rpi[i].local
,其中 [i] 代表我的 pi 编号,我可以获得访问权限,但广播命令不是一种选择。当我进入 Ubuntu,然后进入 terminator 或 tmux 时,我无法通过 ssh 获得访问权限,错误消息为:
ssh: Could not resolve hostname rpi2.local: Temporary failure in name resolution
当我拔下连接笔记本电脑和 pis 的电缆时,错误消息并没有改变。
有谁知道问题可能是什么以及为什么我无法通过 Ubuntu 连接,但 powershell 工作正常?
答案1
既然你提到 Pi 可以从 Windows 主机访问,但不是在互联网上,我假设它们要么位于单独的 VLAN 上,要么具有防火墙规则以阻止来自本地网络之外的设备进行访问。
然而,在 WSL2 上运行的 Ubuntu是实际上与 Windows 主机位于不同的网络上。其网络运行在 NAT 虚拟 Hyper-V 交换机后面。
这可能是 Ubuntu 无法连接到 Pi 的原因。如果是这样,那么这个问题,但答案却类似。
这应该还解释了名称解析失败的事实。 TLD.local
表示 Pi 正在使用 mDNS。 我不是 mDNS 专家,但我猜你需要能够在网络上看到它们才能通过这种方式获取它们的地址。 Ubuntu/WSL2 没有可以用来执行查找的“DNS 服务器” .local
。
话虽如此,这里有一些可能的选择(和非选择):
通过 Ubuntu 运行 Windows SSH 客户端
一开始我只是在答案的底部添加了一个想法,但它可能是最直接的解决方案。
尝试:
ssh.exe -X pi[i]@rpi[i].local
由于 Ubuntu 可以运行 Windows 命令(只要您附加.exe
,您可能只需利用这种形式来完成您的任务。
一个潜在的警告是,您可以选择-X
其中的 X11 转发。如果您确实需要将其转发到 Ubuntu(通过 WSLg),那么这可能不是一个选项。我还没有以那种方式测试过它。
WSL1
不幸的是,对于您的用例,您可能无法在此处使用 WSL1。通常这是解决此类问题最简单的方法。WSL1 作为伪内核转换层运行直接地到 Windows 内核。因此,它与 Windows 主机共享同一个网络。
但是,WSL1 不支持 mDNS,因此如果您想使用 WSL1,则需要使用 IP 地址或为这些 Pi 地址设置某种类型的解析器。这应该是可能的(IIRC),通过编辑视窗主机文件(c:\Windows\System32\Drivers\etc\hosts
)。
如果您想使用此方法,请参阅我上面链接的另一个答案,了解如何备份和转换到 WSL1。
通过 Windows OpenSSH 服务器进行 SSH Jumphost
我发现 Windows OpenSSH 服务器是连接辅助的“瑞士军刀”。在这种情况下,概念与其他答案相同,但流程相反。
按照其他答案中提到的配置 Windows OpenSSH 服务器后,您将能够通过以下命令访问您的 Pi:
ssh -X pi[i]@rpi[i].local -J $(hostname).local
如果您的用户名与 Windows 不同,您可以使用:
ssh -X pi[i]@rpi[i].local -J <windows_username>@$(hostname).local
这样做的目的是首先使用 mDNS ( ) 连接到 Windows OpenSSH 服务器$(hostname).local
,然后将其用作 Pi 的跳转主机。由于您将在“跳转”后连接到 Windows 网络,因此 Pi 的 mDNS 查找应该也很好用。我使用我的网络对此进行了最好的测试。
桥接网络
正如另一个答案中提到的,可以使用实验性功能在桥接模式下创建虚拟网络交换机。不过,你不再需要 WSL 的预览版 - 只要你从 Microsoft Store 安装了 WSL,它应该工作。
PowerShell 和/或 Windows SSH 客户端通过多路复用
与第一个可能的解决方案类似,并且尚未针对此特定用例进行测试,但理论上你可以在我的答案在这里通过运行 PowerShell(或 Windows SSH 客户端)来处理此问题里面Ubuntu 中的 Tmux。