Điều này bổ sung cho các câu trả lời khác với thông tin cụ thể từ Windows - Hệ thống con cho Linux. Các câu trả lời được chấp nhận là đúng: bạn DISPLAY
biến được cấu hình không đúng. Tuy nhiên, điều đó không rõ ràng chính xác tại sao chỉ có trường hợp từ câu trả lời đó, vì vậy tôi đang hồi tưởng với câu trả lời này.
Nếu bạn đang chạy cygwin hoặc Windows-subsystem cho Linux và máy chủ X11 của bạn dựa trên windows (ví dụ: VcXsrv
hoặc XMing
), nhiều khả năng máy chủ X11 của bạn đang lắng nghe trên cổng TCP (chẳng hạn như 127.0.0.1
trên các cổng TCP6000-6010
) ổ cắm tên miền Unix mặc định (/tmp/.X11-unix/X0
). Ổ cắm Unix không được hỗ trợ tốt trên Windows tại thời điểm này, ngay cả trong WSL. Giao tiếp giữa các chương trình trong môi trường giống như Linux và các chương trình chạy trực tiếp trên máy chủ windows cũng thường dễ dàng hơn các ổ cắm IP.
Khi bạn chạy các ứng dụng đồ họa cục bộ (tức là từ môi trường Cygwin hoặc WSL của máy chủ của bạn) và của bạn DISPLAY
biến được đặt thành mặc định (nghĩa là DISPLAY=:0.0
), trước tiên các ứng dụng sẽ cố gắng kết nối với máy chủ X thông qua ổ cắm Unix /tmp/.X11-unix/X0
. Điều này sẽ thất bại, nhưng hầu hết các ứng dụng sẽ chuyển sang kết nối TCP trênlocalhost
, điều này sẽ thành công trong việc tiếp cận máy chủ, giả sử máy chủ X của bạn được cấu hình với mặc định.
Bạn có thể xác nhận rằng điều này đang xảy ra bằng cách tìm kiếm connect()
cuộc gọi trong nhật ký strace từ một ứng dụng đồ họa của bạn. Những điều đó thường sẽ xảy ra sớm, trước khi cửa sổ chính của ứng dụng xuất hiện.
Hành vi dự phòng đó không xảy ra khi ssh đang chuyển hướng kết nối từ phía xa, do đó bạn đang gặp phải lỗi đó. sshd
thực sự đang chuyển tiếp kết nối đến phía cục bộ, nhưng kết nối cục bộ của máy khách ssh đã hết hạn khi không thể truy cập máy chủ qua ổ cắm Unix. Bạn đang nhận được ENOENT
lỗi.
Trong các trường hợp như vậy, thay đổi DISPLAY
biến của bạn để sử dụng cú pháp TCP thay vì:0.0
cú pháp, có thể khắc phục sự cố:
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
Giống như các câu trả lời khác được đề cập, bạn cũng có thể xuất biến đó một cách tương tác từ dấu nhắc shell của bạn:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
Bạn cũng có thể lưu trữ cài đặt này lâu dài hơn bằng cách thêm dòng đó vào tập lệnh khởi tạo hồ sơ shell đăng nhập của bạn (ví dụ ~/.bash_profile
).
Lưu ý: Một số shell có tập lệnh khởi tạo khác nhau cho các phiên đăng nhập và không đăng nhập. Chẳng hạn, với bash, bạn có thể viết dòng đó vào tập lệnh không đăng nhập, tức là ~/.bashrc
thay vì ~/.bash_profile
. Nếu bạn làm như vậy, hãy cẩn thận không ghi đè bất kỳ giá trị tùy chỉnh nào có thể được đặt bởi ssh. Đó sẽ là trường hợp nếu bạn lần đầu tiên nhảy vào máy chủ của mình thông qua ssh và sau đó nhảy lại vào một máy chủ khác (do đó lồng vào chuyển tiếp X11 của bạn).
strace -fo /tmp/trace ssh....
để kiểm tra xem nó có cố gắng kết nối ổ cắm tên miền Unix đó không.