更新
開発者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
この回答の最後に、形式に関する情報を追加しました。)
これはxauth
、DISPLAY
変数のこの特別な具体化を処理する方法を知っている必要があることを意味し、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 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
自分?