Evince 无法启动,因为它无法读取 .Xauthority

Evince 无法启动,因为它无法读取 .Xauthority

我通过 SSH 远程登录,并使用 X 转发到运行 Ubuntu 10.04 的计算机(清晰)。大多数 X11 应用程序(例如 xterm、gnome-terminal)都可以正常工作。但埃文斯并没有开始。它似乎无法读取~/.Xauthority,即使该文件存在,并且显然是可读的(它具有正确的权限,其他应用程序可以很好地读取它)。

$ evince
X11 connection rejected because of wrong authentication.
Cannot parse arguments: Cannot open display:
$ echo DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY
DISPLAY=localhost:10.0 XAUTHORITY=
$ strace evince
access("/home/gilles/.Xauthority", R_OK) = 0
open("/home/gilles/.Xauthority", O_RDONLY) = -1 EACCES (Permission denied)
$ ls -l ~/.Xauthority
-rw------- 1 gilles gilles 496 Jul  5 13:34 /home/gilles/.Xauthority

Evince 有什么特别之处以至于它无法读取~/.Xauthority?我怎样才能让它开始?

答案1

TL,DR:这是 Apparmor 的错,因为我的主目录位于/home.

在默认安装的 Ubuntu 10.04 下,阿帕莫尔包作为间接的推荐级别依赖项被拉入ubuntu 标准包裹。系统日志 ( /var/log/syslog) 显示 Apparmor 拒绝 Evince 的读取尝试~/.Xauthority

Jul 5 17:58:31 darkstar kernel: [15994724.481599] type=1503 audit(13415 03911.542:168): operation="open" pid=9806 parent=9805 profile="/usr/bin/evince" requested_mask="r::" denied_mask="r::" fsuid=1001 ouid=1001 name="/elsewhere/home/gilles/.Xauthority"

Apparmor 的默认 Evince 配置(在 中/etc/apparmor.d/usr.bin.evince)非常宽松:它允许在所有主目录下进行任意读写。但是,我在这台机器上的主目录是一个指向非标准位置的符号链接,该位置未在默认 AppArmor 配置中列出。允许在 下访问/home,但我的主目录的实际位置是/elsewhere/home/gilles,因此访问被拒绝。

可能受此问题影响的其他应用程序包括:

  • Firefox,但它的配置文件是默认禁用(通过存在符号链接/etc/apparmor.d/disable/usr.bin.firefox -> /etc/apparmor.d/usr.bin.firefox)。
  • CUPS PDF 打印;我还没有测试过,但我预计它无法写入~/PDF.

我的解决方法是编辑/etc/apparmor.d/tunables/home.d/local并添加行

@{HOMEDIRS}+=/elsewhere/home/

识别主目录的非标准位置(请注意,最后一个位置/很重要;请参阅 中的注释/etc/apparmor.d/tunables/home.d/ubuntu),然后运行/etc/init.d/apparmor reload以更新 Apparmor 设置。

如果您没有管理员权限并且系统管理员没有响应,您可以将二进制文件复制evince到其他位置,例如~/bin,并且它不会被 Apparmor 策略覆盖(因此您将能够启动它,但是将无法获得 Apparmor 提供的非常有限的额外安全性)。

此问题已报告为Ubuntu 错误#447292。该解决方案处理某些用户的主目录在/etc/passwdexternal中列出的情况/home,但不处理像我这样的情况,其中/home/gilles是符号链接。

答案2

有同样的问题,你的回答为我指明了正确的方向。我找到了一个不同的解决方案,不需要编辑 apparmor 配置。不要使用符号链接将访问重定向到/home,而是使用bind上的选项mount。我添加了以下行/etc/fstab

/elsewhere/home /home none bind

一旦你这样做了,apparmor 甚至不会知道下面的目录/home“真正”位于其他地方,所以抱怨就会消失。

这种方法的优点是它适用于所有应用程序,而无需为每个应用程序编辑不同的 apparmor 配置文件。

相关内容