ssh -X在优胜美地上不起作用


16

不能再将X11与ssh一起使用。安装了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:“添加”命令中的错误显示名称“ /private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0”

有关如何解决此问题的任何想法?


2
返回的显示名称$DISPLAY错误。应该是这样的:0.0。你$DISPLAY是自己~/.bash_profile还是~/.profile自己?
Jaume 2015年

2
使用-Y选项代替时会有所不同-X吗?您的服务器使用什么操作系统?并且:在Mac上进行$DISPLAY设置/tmp/是完全正常的。
2015年

@jaume我没有设置自己的$ DISPLAY变量。但是,手动更改它似乎已解决。我现在仍然确定它最终是什么。
stakSmashr 2015年

您是否同时重启过终端?过去,这帮助我解决了奇怪的环境变量问题…
Asmus

@Asmus我以前重新启动了终端,以及多次重新启动计算机都无济于事。我一直在使用OS X 10.10.2。我所做的只是做类似的事情DISPLAY=:0.0,而且行得通。我已将此添加到我的.bash_profile中
stakSmashr 2015年

Answers:


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现在可以正确解析优胜美地启动的$ 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的代码无法捕获它。(...)

根据错误描述,此问题将在XQuartz 2.7.8中解决,该版本已延迟4个月(请参阅项目路线图页面,网址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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.