我正在嘗試使用 SSHFS 將位於 WSL 內的資料夾安裝到我的 Ubuntu 20.4 計算機,但我總是收到“沒有這樣的檔案或目錄”的訊息。我該怎麼做?
我嘗試掛載目錄的明顯方法如下:
sshfs user@remotehost:"\\wsl$\Ubuntu-20.04" /home/user/Remote/
答案1
簡短回答:
使用 Windows 主機作為 ssh 跳轉主機來存取 WSL。
更多詳情:
嘗試透過 ssh 存取 WSL(尤其是 WSL2)時存在一些陷阱:
首先,您可能會遇到這樣的情況:WSL2 在虛擬化環境中運行,並帶有 NAT 虛擬網路卡。這意味著 WSL2 中執行的服務無法從網路上的其他電腦直接存取。
WSL 確實提供本地主機轉送,它允許從 Windows 主機本身存取在 WSL2 中運行的服務(透過localhost:portnumber
)。但這不會擴及到網路上的其他電腦。
你可以看到完整的 Github 線程這裡連結直接指向評論通常建議解決這個問題。
它涉及:
- 設定防火牆規則
- 從 Windows 到 WSL2 虛擬網路介面的連接埠轉發
- 這裡最大的挑戰是每次 WSL 重新啟動時 vNIC 的位址都會變更。因此,腳本必須刪除舊規則並在每次重新啟動時重新建立它們。
但是,透過更新的編輯,您似乎正在嘗試稍微不同的東西,您可能正在嘗試透過 Windows(也許是透過 Windows 主機本身上的 ssh)存取 WSL 偽共享。
不幸的是,這也不起作用,因為\\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”,因為這是從跳轉主機(Windows 主機)角度來看的位址。