ssh -X không hoạt động trên Yosemite


16

Không thể sử dụng X11 với ssh. Đã cài đặt XQuartz2.7.7. Đăng nhập bằng X11 qua ssh đưa ra các cảnh báo

Cảnh báo: thiết lập chuyển tiếp X11 không tin cậy không thành công: dữ liệu khóa xauth không được tạo Cảnh báo: Không có dữ liệu xauth; sử dụng dữ liệu xác thực giả để chuyển tiếp X11.

Trong hệ thống của riêng tôi, echo $DISPLAYcho

/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz 0

Tuy nhiên, khi tôi thử xauth generate $DISPLAY . trusted, tôi gặp lỗi

xauth: (argv): 1: tên hiển thị xấu "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz 0" trong lệnh "thêm"

Bất kỳ ý tưởng trong cách khắc phục điều này?


2
Tên hiển thị như được trả về $DISPLAYlà sai. Nó sẽ là một cái gì đó như :0.0. Bạn có thiết lập $DISPLAYtrong ~/.bash_profilehoặc ~/.profilechính mình?
jaume

2
Liệu nó có làm nên sự khác biệt khi bạn sử dụng -Ytùy chọn thay vì -X? Máy chủ của bạn đang sử dụng hệ điều hành nào? Và: $DISPLAYcài đặt của bạn vào một cái gì đó /tmp/là hoàn toàn bình thường trên máy Mac.
Asmus

@jaume Tôi không đặt biến $ HIỂN THỊ của riêng mình. Tuy nhiên, thay đổi bằng tay dường như đã sửa nó. Bây giờ tôi vẫn chắc chắn làm thế nào nó trở thành như vậy.
stakSmashr

Bạn đã khởi động lại Terminal của mình trong lúc này chưa? Điều này giúp tôi với các vấn đề biến môi trường kỳ lạ trong quá khứ
Asmus

@Asmus Trước đây tôi đã khởi động lại Terminal cũng như khởi động lại máy tính nhiều lần nhưng không có kết quả. Tôi đã sử dụng OS X 10.10.2. Tất cả tôi đã làm là làm một cái gì đó như DISPLAY=:0.0, và nó đã làm việc. Tôi đã thêm phần này vào .bash_profile của mình
stakSmashr

Câu trả lời:


20

CẬP NHẬT

Nhà phát triển Jeremy Huddleston Sequoia hôm qua tuyên bố rằng vấn đề này đã được giải quyết trong XQuartz 2.7.8_beta2 :

XQuartz 2.7.8_beta2 có sẵn để tải xuống.

Bạn có thể xem http://xquartz.macosforge.org/trac/wiki/X112.7.8 để biết đầy đủ các thay đổi, nhưng hầu hết các thay đổi đáng chú ý là:

1) xauth hiện phân tích chính xác trình khởi chạy Yosemite $ Đường dẫn ổ cắm HIỂN THỊ
2) libGL đã được cập nhật lên Mesa 10.4.4
3) Nhiều cách khai thác khác nhau đã được sửa trong xorg-server, freetype và libpng
4) đã được sửa

Báo cáo lỗi được đóng và đánh dấu là cố định:

nhập mô tả hình ảnh ở đây

Nếu bạn không thể (hoặc không muốn) cài đặt bản beta, bạn vẫn có thể sử dụng cách giải quyết mà tôi giải thích bên dưới.


CÂU TRẢ LỜI

Phân tích

(cuộn xuống cho phần giải pháp)

Suy nghĩ đầu tiên của tôi là " DISPLAYbiến là sai". Nhưng nó không phải là.

Khi nó bật ra, trên OS X 10.10 Yosemite (và trở lại 10.8 Mountain Lion ), DISPLAYbiến lưu trữ một launchdđường dẫn ổ cắm:

/private/tmp/<socket name>

thay vì tên hiển thị quen thuộc:

hostname:displaynumber.screennumber

(Tôi đã thêm một số thông tin về hostname:displaynumber.screennumberđịnh dạng ở cuối câu trả lời này.)

Điều này có nghĩa là xauthphải biết cách đối phó với DISPLAYbiến số đặc biệt này , và như Mavericks, nó đã làm, nhưng ổ cắm được sử dụng trong Yosemite có một con đường khác (chính xác hơn: /private/tmp/com.apple.launchd.XXXXthay vì /private/tmp/launch-XXXX) và xauthphá vỡ.

Lỗi này đã được báo cáo cho nhóm XQuartz vào ngày 18 tháng 11 năm 2014 (3 tháng trước) ( http://xquartz.macosforge.org/trac/ticket/2068 ):

Chương trình xauth có mã trong cả gethost.c và Parsedpy.c để tìm tên $ HIỂN THỊ bắt đầu bằng "/ tmp / launch" và coi đó là ổ cắm cục bộ. Tuy nhiên, vị trí dường như đã thay đổi, $ HIỂN THỊ bây giờ bắt đầu bằng "/private/tmp/com.apple.launchd", vì vậy mã đang tìm kiếm / tmp / launch không bắt được. (...)

Theo mô tả lỗi, nó sẽ được giải quyết trong XQuartz 2.7.8, trễ 4 tháng (xem trang lộ trình dự án tại http://xquartz.macosforge.org/trac/roadmap ).

Các miếng vá mà sửa chữa các vấn đề đã được cam kết trên Tháng Mười Hai 31, 2014 cho dự án freedesktop.org ( http://cgit.freedesktop.org/xorg/app/xauth/commit/parsedpy.c?id=f990dd936b5fd1a40290bb88cde517a0ac38f823 ):

diff --git a/parsedpy.c b/parsedpy.c
index c591b77..7365224 100644
--- a/parsedpy.c
+++ b/parsedpy.c
@@ -42,6 +42,9 @@ in this Software without prior written authorization from The Open Group.
 #include <X11/Xauth.h>         /* for FamilyLocal */
 #include <X11/Xmu/SysUtil.h>

+#include <sys/stat.h>
+#include <sys/syslimits.h>
+
 #if defined(UNIXCONN) || defined(LOCALCONN)
 #define UNIX_CONNECTION "unix"
 #define UNIX_CONNECTION_LENGTH 4
@@ -158,8 +161,32 @@ parse_displayname (const char *displayname,

     if (!host) return False;

-    if(strncmp (host, "/tmp/launch", 11) == 0) {
-        family = FamilyLocal;
+    {
+        /*
+         * If using launchd socket, remove the screen number from the end
+         * of $DISPLAY and check if it is a path to a socket.
+         */
+        char path[PATH_MAX];
+        struct stat sbuf;
(...)

Vì vậy, đây chỉ là câu hỏi về thời gian cho đến khi bản vá này tìm được bản phát hành tiếp theo của XQuartz.

Cách giải quyết

(đã thử nghiệm trên OS X 10.10.2 Yosemite.)

Thêm vào:

alias ssh="ln -fs $(echo $DISPLAY | sed 's:\(/private/tmp/com\.apple\.launchd\.[^/]*\)/.*:\1:') $(echo $DISPLAY | sed 's:/private/tmp/com\.apple\.launchd\.\([^/]*\)/.*:/private/tmp/launch-\1:'); ssh"

đến ~/.bashrcvà bắt đầu một cửa sổ Terminal mới hoặc nguồn nó ( . ~/.bashrc) trong phiên Terminal hiện tại của bạn.

Bí danh này trước tiên liên kết đường dẫn ổ cắm đến /private/tmp/launch-XXX(ví dụ ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS) và sau đó bắt đầu ssh:

nhập mô tả hình ảnh ở đây


Đối với người tò mò, theo truyền thống, tên hiển thị của máy chủ X đã có dạng này (từ man Xtrên Ubuntu): Tên hiển thị của máy chủ X có dạng này:

hostname:displaynumber.screennumber

Ở đâu:

   hostname
           The hostname specifies the name of the machine to which the display  is  physically
           connected.   If  the hostname is not given, the most efficient way of communicating
           to a server on the same machine will be used.

   displaynumber
           The phrase "display" is usually used to refer to  a  collection  of  monitors  that
           share a common set of input devices (keyboard, mouse, tablet, etc.).  Most worksta‐
           tions tend to only have one display.  Larger,  multi-user  systems,  however,  fre‐
           quently  have  several  displays so that more than one person can be doing graphics
           work at once.  To avoid confusion, each display on a machine is assigned a  display
           number (beginning at 0) when the X server for that display is started.  The display
           number must always be given in a display name.

   screennumber
           Some displays share their input devices among two or more monitors.  These  may  be
           configured as a single logical screen, which allows windows to move across screens,
           or as individual screens, each with their own set of windows.  If  configured  such
           that each monitor has its own set of windows, each screen is assigned a screen num‐
           ber (beginning at 0) when the X server for that display is started.  If the  screen
           number is not given, screen 0 will be used.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.