我透過 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/passwd
external中列出的情況/home
,但不處理像我這樣的情況,其中/home/gilles
是符號連結。
答案2
有同樣的問題,你的回答為我指明了正確的方向。我找到了一個不同的解決方案,不需要編輯 apparmor 配置。不要使用符號連結將存取重定向到/home
,而是使用bind
上的選項mount
。我新增了以下行/etc/fstab
:
/elsewhere/home /home none bind
一旦你這樣做了,apparmor 甚至不會知道下面的目錄/home
「真正」位於其他地方,所以抱怨就會消失。
這種方法的優點是它適用於所有應用程序,而無需為每個應用程式編輯不同的 apparmor 設定檔。