ssh -X tidak berfungsi pada Yosemite

16

Tidak dapat lagi menggunakan X11 dengan ssh. Apakah XQuartz2.7.7 diinstal. Masuk dengan X11 melalui ssh memberikan peringatan

Peringatan: penyiapan penerusan X11 yang tidak terpercaya gagal: data kunci xauth tidak dihasilkan Peringatan: Tidak ada data xauth; menggunakan data otentikasi palsu untuk penerusan X11.

Dalam sistem saya sendiri, echo $DISPLAYmemberi

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

Namun, ketika saya mencoba xauth generate $DISPLAY . trusted, saya mendapatkan kesalahan

xauth: (argv): 1: nama tampilan buruk "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz," dalam perintah "add"

Ada ide bagaimana cara memperbaikinya?

stakSmashr
sumber
2
Nama tampilan yang dikembalikan oleh $DISPLAYsalah. Seharusnya seperti itu :0.0. Apakah Anda mengatur $DISPLAYdi ~/.bash_profileatau ~/.profilediri Anda sendiri?
jaume
2
Apakah itu membuat perbedaan ketika Anda menggunakan -Yopsi, bukan -X? Sistem operasi apa yang digunakan server Anda? Dan: memiliki $DISPLAYset Anda untuk sesuatu masuk /tmp/sangat normal pada Mac.
Asmus
@jaume Saya tidak mengatur variabel $ DISPLAY saya sendiri. Namun, mengubahnya secara manual tampaknya telah memperbaikinya. Saya masih yakin bagaimana akhirnya menjadi seperti itu.
stakSmashr
Apakah Anda me-restart Terminal Anda sementara itu? Ini membantu saya dengan masalah variabel lingkungan yang aneh di masa lalu ...
Asmus
@ Asmus saya sebelumnya telah me-restart Terminal serta me-reboot komputer berkali-kali tanpa hasil. Saya telah menggunakan OS X 10.10.2. Yang saya lakukan hanyalah melakukan sesuatu DISPLAY=:0.0, dan itu berhasil. Saya telah menambahkan ini ke .bash_profile saya
stakSmashr

Jawaban:

20

MEMPERBARUI

Pengembang Jeremy Huddleston Sequoia mengumumkan kemarin bahwa masalah ini diselesaikan di XQuartz 2.7.8_beta2 :

XQuartz 2.7.8_beta2 tersedia untuk diunduh.

Anda dapat melihat http://xquartz.macosforge.org/trac/wiki/X112.7.8 untuk set lengkap perubahan, tetapi yang paling penting adalah:

1) xauth sekarang dengan benar mem-parsing peluncuran Yosemite $ soket jalur
2 DISPLAY 2) libGL telah diperbarui ke Mesa 10.4.4
3) Berbagai eksploitasi diperbaiki di xorg-server, freetype, dan libpng
4) Bug yang mencegah pembaruan otomatis dalam beberapa kasus memiliki telah diperbaiki

Laporan bug ditutup dan ditandai sebagai diperbaiki:

masukkan deskripsi gambar di sini

Jika Anda tidak dapat (atau tidak ingin) menginstal beta, Anda masih dapat menggunakan solusi yang saya jelaskan di bawah ini.


MENJAWAB

Analisis

(gulir ke bawah untuk bagian pemecahan masalah)

Pikiran pertama saya adalah " DISPLAYvariabelnya salah". Tapi ternyata tidak.

Ternyata, pada OS X 10.10 Yosemite (dan kembali ke 10.8 Mountain Lion ) DISPLAYvariabel menyimpan launchdpath socket:

/private/tmp/<socket name>

alih-alih nama tampilan yang dikenal:

hostname:displaynumber.screennumber

(Saya telah menambahkan beberapa informasi tentang hostname:displaynumber.screennumberformat pada akhir jawaban ini.)

Ini berarti bahwa xauthharus mengetahui cara menangani inkarnasi khusus dari DISPLAYvariabel ini, dan seperti yang dilakukan Mavericks, memang demikian, tetapi soket yang digunakan di Yosemite memiliki jalur yang berbeda (lebih tepatnya: /private/tmp/com.apple.launchd.XXXXalih-alih /private/tmp/launch-XXXX), dan xauthpecah.

Bug ini dilaporkan ke tim XQuartz pada 18 November 2014 (3 bulan lalu) ( http://xquartz.macosforge.org/trac/ticket/2068 ):

Program xauth memiliki kode di gethost.c dan parsedpy.c untuk mencari nama $ DISPLAY yang dimulai dengan "/ tmp / launch", dan memperlakukannya sebagai soket lokal. Namun, lokasi tampaknya telah berubah, $ DISPLAY sekarang dimulai dengan "/private/tmp/com.apple.launchd", sehingga kode yang mencari / tmp / launch tidak menangkapnya. (...)

Menurut deskripsi bug itu harus diselesaikan di XQuartz 2.7.8, yang terlambat 4 bulan (lihat halaman peta jalan proyek di http://xquartz.macosforge.org/trac/roadmap ).

Tambalan yang memperbaiki masalah ini dilakukan pada 31 Desember 2014 ke proyek 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;
(...)

Jadi itu hanya masalah waktu sampai tambalan ini menemukan jalan ke rilis XQuartz berikutnya.

Penanganan masalah

(diuji pada OS X 10.10.2 Yosemite.)

Menambahkan:

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"

untuk ~/.bashrcdan memulai jendela Terminal baru atau sumbernya ( . ~/.bashrc) di sesi Terminal Anda saat ini.

Alias ​​ini pertama kali menghubungkan jalur soket ke /private/tmp/launch-XXX(misalnya ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS) dan kemudian mulai ssh:

masukkan deskripsi gambar di sini


Bagi yang penasaran, secara tradisional, nama tampilan X server memiliki formulir ini (dari man Xpada Ubuntu): Nama tampilan X server memiliki formulir ini:

hostname:displaynumber.screennumber

dimana:

   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.
Jaume
sumber