Dies ergänzt andere Antworten mit Informationen, die spezifisch für Windows-Subsystem für Linux sind. Die akzeptierte Antwort ist richtig: Ihre DISPLAY
Variable ist falsch konfiguriert. Es ist jedoch nicht ganz klar, warum dies allein aufgrund dieser Antwort der Fall ist, und deshalb kann ich mit dieser Antwort Abhilfe schaffen.
Wenn Sie cygwin oder Windows-Subsystem für Linux ausführen und Ihr X11-Server auf Windows basiert (z. B. VcXsrv
oder XMing
), ist es wahrscheinlicher, dass Ihr X11-Server einen TCP-Port überwacht (z. B. 127.0.0.1
TCP-Ports 6000-6010
) als einen der Standard-Unix-Domain-Socket ( /tmp/.X11-unix/X0
). Unix-Sockets werden unter Windows zu diesem Zeitpunkt nicht gut unterstützt, auch nicht innerhalb der WSL. Die Kommunikation zwischen Programmen in einer Linux-ähnlichen Umgebung und Programmen, die direkt auf dem Windows-Host ausgeführt werden, ist im Allgemeinen auch über IP-Sockets einfacher.
Wenn Sie grafische Anwendungen lokal ausführen (z. B. in der Cygwin- oder WSL-Umgebung Ihres Hosts) und Ihre DISPLAY
Variable auf den Standardwert (z. B. DISPLAY=:0.0
) festgelegt ist, versuchen Anwendungen zunächst, über den Unix-Socket eine Verbindung zum X-Server herzustellen /tmp/.X11-unix/X0
. Dies schlägt fehl, aber die meisten Anwendungen greifen dann auf eine TCP-Verbindung zurück localhost
, über die der Server erreicht werden kann, vorausgesetzt, Ihr X-Server ist mit Standardeinstellungen konfiguriert.
Sie können dies bestätigen, indem Sie connect()
in Verlaufsprotokollen nach Aufrufen aus einer Ausführung Ihrer grafischen Anwendung suchen . Diese treten in der Regel früh auf, bevor das Hauptfenster der Anwendung angezeigt wird.
Dieses Fallback-Verhalten tritt nicht auf, wenn ssh eine Verbindung von der Remote-Seite umleitet, sodass dieser Fehler angezeigt wird. sshd
Die Verbindung wird zwar an die lokale Seite weitergeleitet, aber die lokale Verbindung des SSH-Clients endet, da der Server nicht über den Unix-Socket erreicht werden kann. Sie erhalten dann den ENOENT
Fehler.
In solchen Fällen kann das Problem behoben werden, indem Sie Ihre DISPLAY
Variable so ändern, dass anstelle der :0.0
Syntax die TCP-Syntax verwendet wird :
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
Wie bei anderen Antworten erwähnt, können Sie diese Variable auch interaktiv aus Ihrer Shell-Eingabeaufforderung exportieren:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
Sie können diese Einstellung auch dauerhafter speichern, indem Sie diese Zeile zum Initialisierungsskript Ihres Anmelde-Shell-Profils hinzufügen (z ~/.bash_profile
. B. ).
Hinweis: Einige Shells haben ein anderes Initialisierungsskript für Anmelde- und Nicht-Anmeldesitzungen. Zum Beispiel könnten Sie mit bash diese Zeile in das Nicht-Anmeldeskript schreiben, dh ~/.bashrc
anstelle von ~/.bash_profile
. Wenn Sie dies tun, achten Sie darauf, keinen benutzerdefinierten Wert zu überschreiben, der möglicherweise von ssh festgelegt wurde. Dies wäre der Fall, wenn Sie zuerst über ssh auf Ihren Host und dann erneut auf einen anderen Host springen würden (wodurch Ihre X11-Weiterleitung verschachtelt würde).
strace -fo /tmp/trace ssh....
, um zu überprüfen, ob es versucht, diesen Unix-Domain-Socket zu verbinden.