Evince не запускается, потому что не может прочитать .Xauthority

10

Я вошел в систему удаленно через SSH с переадресацией X на машину под управлением Ubuntu 10.04 (lucid). Большинство приложений X11 (например, xterm, gnome-терминал) работают нормально. Но Evince не запускается. Кажется, что он не в состоянии читать ~/.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? Как я могу сделать это начать?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

12

TL, DR: это вина Apparmor, и из-за того, что мой домашний каталог находится снаружи /home.

При установке по умолчанию Ubuntu 10.04 пакет apparmor включается как косвенная зависимость уровня Recommended пакета ubuntu-standard . Системные журналы ( /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"

Конфигурация Evince по умолчанию для Apparmor (in /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/passwdснаружи /home, но не такие случаи, как мой, где /home/gillesесть символическая ссылка.

Жиль "ТАК - перестань быть злым"
источник
Спасибо. В Ubuntu 16.04 соответствующий файл называется «/etc/apparmor.d/tunables/home.d/ubuntu», и вместо редактирования вручную рекомендуется выполнить команду: «sudo dpkg-reconfigure apparmor» (которая даст вам возможность добавлять домашние локации)
arr_sea
2

Была такая же проблема, и ваш ответ указал мне правильное направление. Я нашел другое решение, которое не требует редактирования конфигурации apparmor. Вместо использования символической ссылки для перенаправления доступа /homeиспользуйте bindпараметр on mount. Я добавил следующую строку /etc/fstab:

/elsewhere/home /home none bind

Как только вы сделаете это, apparmor даже не узнает, что каталоги /home«действительно» находятся где-то еще, поэтому жалобы исчезнут.

Преимущество этого подхода состоит в том, что он будет работать для всех приложений, без необходимости редактировать разные файлы конфигурации apparmor для каждого из них.

Дэн Менес
источник
1
Это не было бы применимо в моем случае: там были домашние каталоги, /homeа другие нет /home. Вариант для этого случая заключается в связывании монтажа /elsewhere/home/gillesв /home/gillesили /elsewhere/homeна /home/elsewhere.
Жиль "ТАК - перестань быть злым"