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:
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à " DISPLAY
biế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 ), DISPLAY
biế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à xauth
phải biết cách đối phó với DISPLAY
biế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.XXXX
thay vì /private/tmp/launch-XXXX
) và xauth
phá 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 ~/.bashrc
và 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
:
Đố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 X
trê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.
$DISPLAY
là sai. Nó sẽ là một cái gì đó như:0.0
. Bạn có thiết lập$DISPLAY
trong~/.bash_profile
hoặc~/.profile
chính mình?