ssh -X ไม่ทำงานบนโยเซมิตี


16

ไม่สามารถใช้ X11 กับ ssh ได้อีกต่อไป ติดตั้ง XQuartz2.7.7 แล้ว เข้าสู่ระบบด้วย X11 ผ่าน ssh ให้คำเตือน

คำเตือน: การตั้งค่าการส่งต่อ X11 ที่ไม่น่าเชื่อถือล้มเหลว: ไม่มีการสร้างข้อมูลคีย์ xauth คำเตือน: ไม่มีข้อมูล xauth; ใช้ข้อมูลการตรวจสอบสิทธิ์ปลอมสำหรับการส่งต่อ X11

ในระบบของฉันเองecho $DISPLAYให้

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

อย่างไรก็ตามเมื่อฉันลองxauth generate $DISPLAY . trustedฉันได้รับข้อผิดพลาด

xauth: (argv): 1: ชื่อที่แสดงไม่ถูกต้อง "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartzne" ในคำสั่ง "เพิ่ม"

ความคิดใด ๆ ในวิธีการแก้ไขปัญหานี้?


2
ชื่อที่แสดงที่ส่งคืนมา$DISPLAYนั้นไม่ถูกต้อง :0.0มันควรจะเป็นสิ่งที่ชอบ คุณตั้ง$DISPLAYอยู่ใน~/.bash_profileหรือ~/.profileตัวคุณเอง?
jaume

2
มันสร้างความแตกต่างเมื่อคุณใช้-Yตัวเลือกแทน-Xหรือไม่? เซิร์ฟเวอร์ของคุณใช้ระบบปฏิบัติการอะไร และ: การ$DISPLAYตั้งค่าให้บางอย่าง/tmp/เป็นเรื่องปกติอย่างสมบูรณ์บน Mac
Asmus

@jaume ฉันไม่ได้ตั้งค่าตัวแปร $ DISPLAY ของฉันเอง อย่างไรก็ตามการเปลี่ยนด้วยตนเองดูเหมือนว่าจะได้รับการแก้ไข ตอนนี้ฉันยังแน่ใจว่ามันเป็นอย่างไร
stakSmashr

คุณเริ่มต้น Terminal ของคุณใหม่หรือไม่? สิ่งนี้ช่วยฉันด้วยปัญหาตัวแปรสภาพแวดล้อมแปลก ๆ ในอดีต ...
Asmus

@ Assmus ฉันได้รีสตาร์ท Terminal เช่นเดียวกับการรีบูตเครื่องคอมพิวเตอร์หลายครั้งเพื่อประโยชน์ ฉันใช้ OS X 10.10.2 แล้ว ทั้งหมดที่ฉันทำคือทำสิ่งที่ชอบDISPLAY=:0.0และมันทำงานได้ ฉันได้เพิ่มสิ่งนี้ลงใน. bash_profile ของฉัน
stakSmashr

คำตอบ:


20

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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.