Ich versuche, einen Ordner in WSL mit SSHFS auf meinem Ubuntu 20.4-Rechner zu mounten, erhalte aber immer die Meldung „Keine solche Datei oder kein solches Verzeichnis vorhanden“. Wie kann ich das machen?
Ich habe offensichtlich versucht, das Verzeichnis folgendermaßen einzubinden:
sshfs user@remotehost:"\\wsl$\Ubuntu-20.04" /home/user/Remote/
Antwort1
Kurze Antwort:
Verwenden Sie den Windows-Host als SSH-Jumphost, um auf WSL zuzugreifen.
Mehr Details:
Beim Versuch, über SSH auf WSL (insbesondere WSL2) zuzugreifen, gibt es einige Fallstricke:
Zunächst sind Sie möglicherweise auf die Tatsache gestoßen, dass WSL2 in einer virtualisierten Umgebung mit einem NAT-vNIC ausgeführt wird. Dies bedeutet, dass in WSL2 ausgeführte Dienste nicht direkt von anderen Computern im Netzwerk aus zugänglich sind.
WSL bietetLocalhost-Weiterleitung, das den Zugriff vom Windows-Host selbst auf in WSL2 ausgeführte Dienste ermöglicht (über localhost:portnumber
). Dies gilt jedoch nicht für andere Maschinen im Netzwerk.
Sie können einen vollständigen Github-Thread dazu sehenHierwobei der Link direkt zu dem Kommentar führt, dass estypischerweiseempfohlen, um dieses Problem zu beheben.
Es beinhaltet:
- Festlegen von Firewallregeln
- Portweiterleitung von Windows zur virtuellen WSL2-Netzwerkschnittstelle
- Die größte Herausforderung besteht hier darin, dass sich die Adresse der vNIC bei jedem Neustart von WSL ändert. Daher muss das Skript die alten Regeln löschen und bei jedem Neustart neu erstellen.
Aber mit Ihrer aktualisierten Bearbeitung scheinen Sie etwas leicht anderes zu versuchen. Dabei scheint es so, als würden Sie versuchen, über Windows auf die WSL-Pseudofreigabe zuzugreifen, möglicherweise über SSH auf dem Windows-Host selbst.
Leider funktioniert das auch nicht, da \\wsl$\...
es sich selbst um ein Netzwerkdateisystem handelt (mit dem 9P-Protokoll). Das bedeutet, dass es wirklich nichtexistierenauf dem Windows-Host selbst, wenn über SSH zugegriffen wird.
Meine bevorzugte Lösung mit ssh (und damit sshfs
) ist die Verwendung einesssh-Jumphost. Dadurch werden die Probleme mit der „Änderung der vNIC-Adresse“ umgangen und Sie müssen nicht bei jedem Windows-Start ein Skript ausführen.
So richten Sie dies ein:
- Installieren Sie den Windows OpenSSH-Serverauf dem Windows-Host. Ich verwende den Standardport 22 für das „Host“-SSH, aber das müssen Sie nicht unbedingt tun.
- Installieren und konfigurieren Sie SSH in Ihrer WSL-Instanz. Sie müssen hier eine andere Portnummer verwenden als für den Windows-Host. Für dieses Beispiel verwenden wir Port
8022
. Bearbeiten Sie Ihre ,/etc/ssh/sshd_config
um den Port zu ändern. - Optional, aber empfohlen: Richten Sie sowohl die Windows OpenSSH- als auch die WSL-Instanzen mit Ihrem öffentlichen Schlüssel in ein
../ssh/authorized_keys
(unter Windows OpenSSH befindet sich dieser in Ihrem%userprofile%/.ssh
Verzeichnis. Unter Linux/WSL befindet er sich natürlich in~/.ssh
).
Da (wie bereits erwähnt) der Windows-Host auf die WSL2-Instanzen zugreifen kann localhost
, können Sie Windows SSH als Jumphost für die WSL2-SSH-Sitzungen verwenden.
Vorausgesetzt, dass:
- Ihr Windows-Computer hat den Namen
windowshost
(ersetzen Sie ihn durch den tatsächlichen Namen) - Sie haben Ihr Windows OpenSSH auf Port 22
- Sie haben Ihren WSL SSH-Server auf Port 8022
Anschließend können Sie Ihr WSL-System wie folgt mounten:
sshfs -o ssh_command='ssh -J windowshost' -p 8022 localhost:/ <mountpoint>
Die WSL-Instanz ist „localhost“, da dies die Adresse aus der Sicht des Jumphosts (des Windows-Hosts) ist.