UPDATE
ผู้พัฒนา Jeremy Huddleston Sequoia ประกาศเมื่อวานนี้ว่าปัญหานี้ได้รับการแก้ไขในXQuartz 2.7.8_beta2 :
XQuartz 2.7.8_beta2 พร้อมให้ดาวน์โหลดแล้ว
คุณสามารถดูhttp://xquartz.macosforge.org/trac/wiki/X112.7.8สำหรับชุดการเปลี่ยนแปลงเต็มรูปแบบ แต่สิ่งที่สำคัญที่สุดคือ:
1) xauth แยกวิเคราะห์เส้นทางซ็อกเก็ต Yosemite launchd $ DISPLAY อย่างถูกต้อง
2) libGL ได้รับการอัปเดตเป็น Mesa 10.4.4
3) การหาประโยชน์ต่าง ๆ ได้รับการแก้ไขใน xorg-server, freetype และ libpng
4) ข้อผิดพลาดในการปรับปรุงอัตโนมัติในบางกรณี ได้รับการแก้ไขแล้ว
รายงานข้อผิดพลาดถูกปิดและทำเครื่องหมายเป็นคงที่:
หากคุณไม่สามารถ (หรือไม่ต้องการ) ติดตั้งเบต้าคุณยังสามารถใช้วิธีแก้ปัญหาที่ฉันอธิบายด้านล่าง
ตอบ
การวิเคราะห์
(เลื่อนลงสำหรับส่วนวิธีแก้ไข)
ความคิดแรกของฉันคือ " DISPLAY
ตัวแปรผิด" แต่มันไม่ใช่
ตามที่ปรากฎใน OS X 10.10 Yosemite (และกลับไปที่ 10.8 Mountain Lion ) DISPLAY
ตัวแปรจะเก็บlaunchd
เส้นทางซ็อกเก็ต:
/private/tmp/<socket name>
แทนชื่อที่ใช้แสดงที่คุ้นเคย:
hostname:displaynumber.screennumber
(ฉันได้เพิ่มข้อมูลเกี่ยวกับhostname:displaynumber.screennumber
รูปแบบในตอนท้ายของคำตอบนี้)
ซึ่งหมายความว่าxauth
จะต้องรู้วิธีจัดการกับอวตารพิเศษของDISPLAY
ตัวแปรและเท่าที่ Mavericks ทำ แต่ซ็อกเก็ตที่ใช้ในโยเซมิตีมีเส้นทางที่แตกต่างกัน (แม่นยำกว่า: /private/tmp/com.apple.launchd.XXXX
แทนที่จะเป็น/private/tmp/launch-XXXX
) และการxauth
แตก
ข้อผิดพลาดนี้ถูกรายงานไปยังทีม XQuartz เมื่อวันที่ 18 พฤศจิกายน 2014 (3 เดือนที่ผ่านมา) ( http://xquartz.macosforge.org/trac/ticket/2068 ):
โปรแกรม xauth มีรหัสทั้งใน gethost.c และ parsedpy.c เพื่อค้นหาชื่อ $ DISPLAY ที่ขึ้นต้นด้วย "/ tmp / launch" และถือว่าเป็นซ็อกเก็ตในเครื่อง อย่างไรก็ตามสถานที่ดูเหมือนจะเปลี่ยนไปตอนนี้ $ DISPLAY เริ่มต้นด้วย "/private/tmp/com.apple.launchd" ดังนั้นรหัสที่ค้นหา / tmp / launch ไม่สามารถตรวจจับได้ ( ... )
ตามคำอธิบายข้อผิดพลาดมันจะต้องแก้ไขใน XQuartz 2.7.8 ซึ่งเป็นเวลา 4 เดือน (ดูหน้าแผนงานโครงการที่http://xquartz.macosforge.org/trac/roadmap )
แพทช์ที่แก้ไขปัญหาเกิดขึ้นในวันที่ 31 ธันวาคม 2014 ถึงโครงการ 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;
(...)
ดังนั้นมันเป็นเพียงคำถามของเวลาจนกว่าแพทช์นี้จะหาทางไปสู่ XQuartz รุ่นถัดไป
วิธีแก้ปัญหา
(ทดสอบบน OS X 10.10.2 Yosemite)
เพิ่ม:
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"
เพื่อ~/.bashrc
และเริ่มต้นหน้าต่าง Terminal ใหม่หรือแหล่งที่มา ( . ~/.bashrc
) ในเซสชัน Terminal ปัจจุบันของคุณ
นามแฝงนี้แรก symlink เส้นทางซ็อกเก็ตไปที่/private/tmp/launch-XXX
(ตัวอย่างln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS
) และจากนั้นเริ่มssh
:
สำหรับความอยากรู้อยากเห็นแบบดั้งเดิมชื่อที่แสดงของเซิร์ฟเวอร์ X มีฟอร์มนี้ (จากman X
บน Ubuntu): ชื่อที่แสดงของเซิร์ฟเวอร์ X มีรูปแบบนี้:
hostname:displaynumber.screennumber
ที่อยู่:
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
นั้นไม่ถูกต้อง:0.0
มันควรจะเป็นสิ่งที่ชอบ คุณตั้ง$DISPLAY
อยู่ใน~/.bash_profile
หรือ~/.profile
ตัวคุณเอง?