我正在尝试使用 SSHFS 将位于 WSL 内部的文件夹挂载到我的 Ubuntu 20.4 机器上,但我总是收到“没有这样的文件或目录”的消息。我该怎么办?
我尝试挂载目录的明显方法如下:
sshfs user@remotehost:"\\wsl$\Ubuntu-20.04" /home/user/Remote/
答案1
简短回答:
使用 Windows 主机作为 ssh 跳转主机来访问 WSL。
更多详情:
尝试通过 ssh 访问 WSL(尤其是 WSL2)时存在一些陷阱:
首先,您可能已经遇到过这样的情况:WSL2 在虚拟化环境中运行,具有 NAT 的 vNIC。这意味着在 WSL2 中运行的服务无法从网络上的其他计算机直接访问。
WSL 确实提供了本地主机转发,它允许从 Windows 主机本身访问在 WSL2 中运行的服务(通过localhost:portnumber
)。但这不会扩展到网络上的其他机器。
您可以在此处查看完整的 Github 线程这里链接直接指向评论通常建议解决此问题。
它涉及:
- 设置防火墙规则
- 从 Windows 端口转发到 WSL2 虚拟网络接口
- 这里最大的挑战是每次 WSL 重启时,vNIC 的地址都会发生变化。因此,脚本必须删除旧规则并在每次重启时重新创建它们。
但是,通过更新编辑,您似乎正在尝试一些略有不同的东西,您似乎可能正在尝试通过 Windows 访问 WSL 伪共享,也许是通过 Windows 主机本身上的 ssh。
不幸的是,这也行不通,因为\\wsl$\...
它本身就是一个网络文件系统(使用 9P 协议)。这意味着它实际上不能存在通过 ssh 访问时在 Windows 主机上。
我首选的 ssh 解决方案(因此sshfs
)是使用ssh 跳转主机。这解决了“更改 vNIC 地址”问题,并且不需要您在每次启动 Windows 时运行脚本。
要进行设置:
- 安装 Windows OpenSSH 服务器在 Windows 主机上。我为“主机” ssh 使用默认端口 22,但您不一定必须这样做。
- 在您的 WSL 实例中安装并配置 SSH。您需要在此处使用与 Windows 主机不同的端口号。为了便于举例,我们将使用 port
8022
。编辑您的/etc/ssh/sshd_config
以更改端口。 - 可选但推荐的是,使用你的公钥设置 Windows OpenSSH 和 WSL 实例
../ssh/authorized_keys
(在 Windows OpenSSH 上,它位于你的%userprofile%/.ssh
目录下。在 Linux/WSL 中,当然,它位于 中)~/.ssh
。
现在,由于(如前所述)Windows 主机可以访问上的 WSL2 实例localhost
,因此您可以使用 Windows SSH 作为 WSL2 SSH 会话的跳转主机。
假如说:
- 您的 Windows 计算机的名称
windowshost
(请替换其实际名称) - 您的 Windows OpenSSH 位于端口 22
- 你的 WSL SSH 服务器位于端口 8022
然后你可以使用以下命令挂载你的 WSL 系统:
sshfs -o ssh_command='ssh -J windowshost' -p 8022 localhost:/ <mountpoint>
WSL 实例是“localhost”,因为这是从 jumphost(Windows 主机)角度获得的地址。