ssh -XはYosemiteでは機能しません


16

sshでX11を使用できなくなりました。XQuartz2.7.7をインストールしてください。sshを介してX11でログインすると、警告が表示されます

警告:信頼できないX11転送のセットアップに失敗しました:xauthキーデータは生成されません警告:xauthデータはありません。X11転送に偽の認証データを使用します。

私自身のシステムでecho $DISPLAYは、与える

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

しかし、私がしようとするとxauth generate $DISPLAY . trusted、エラーが発生します

xauth:(argv):1:「add」コマンドの表示名「/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0」が正しくない

これを修正する方法についてのアイデアはありますか?


2
によって返される表示名$DISPLAYが間違っています。のようなものでなければなりません:0.0。あなたは、設定してください$DISPLAY~/.bash_profile~/.profile自分?
ジャウメ

2
-Y代わりにオプションを使用すると違いがあります-Xか?サーバーはどのオペレーティングシステムを使用していますか?また、Macで$DISPLAY何かにセットを設定すること/tmp/は完全に正常です。
アスマス

@jaume独自の$ DISPLAY変数を設定しません。ただし、手動で変更すると修正されたようです。私は今でもそれがどのようになっていたかを確信しています。
stakSmashr

その間にターミナルを再起動しましたか?これは、過去の奇妙な環境変数の問題を助けてくれました…
Asmus

@Asmus私は以前にターミナルを再起動しただけでなく、何回もコンピュータを再起動していませんでした。OS X 10.10.2を使用しています。私がやったのは、のようなDISPLAY=:0.0ことをすることだけでした。これを私の.bash_profileに追加しました
stakSmashr

回答:


20

更新

開発者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起動$ 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この回答の最後に、形式に関する情報を追加しました。)

これはxauthDISPLAY変数のこの特別な具体化を処理する方法を知っている必要があることを意味し、Mavericksの時点ではそうでしたが、ヨセミテで使用されるソケットは異なるパス(より正確には:/private/tmp/com.apple.launchd.XXXXではなく/private/tmp/launch-XXXX)を持ち、xauth壊れます。

このバグは2014年11月18日(3か月前)にXQuartzチームに報告されました(http://xquartz.macosforge.org/trac/ticket/2068):

xauthプログラムには、gethost.cとparsedpy.cの両方にコードがあり、「/ tmp / launch」で始まる$ DISPLAY名を探し、それをローカルソケットとして扱います。ただし、場所は変更されたようです。$ DISPLAYは "/private/tmp/com.apple.launchd"で始まるため、/ tmp / launchを探しているコードはそれをキャッチしません。(...)

バグの説明によると、4か月遅れのXQuartz 2.7.8で解決される予定です(http://xquartz.macosforge.org/trac/roadmapのプロジェクトロードマップページを参照)。

問題を修正するパッチは、2014年12月31日に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どちらかの新しいターミナルウィンドウを起動するか、(それをソース. ~/.bashrc)あなたの現在のターミナルセッションインチ

このエイリアスは、最初にソケットパスをシンボリックリンクし/private/tmp/launch-XXX(たとえばln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS)、次に開始しますssh

ここに画像の説明を入力してください


好奇心が強い人のために、伝統的に、Xサーバーの表示名は次の形式になっています(man XUbuntu から):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.