X11

無效的 MIT-MAGIC-COOKIE-1 keyxhost:無法打開顯示“:0”

  • May 14, 2021

每次我打開一個新控制台時,都會顯示錯誤資訊

在此處輸入圖像描述

在此處輸入圖像描述

xxd   ~/.Xauthority
00000000: 0100 0006 6465 6269 616e 0002 3130 0012  ....debian..10..
00000010: 4d49 542d 4d41 4749 432d 434f 4f4b 4945  MIT-MAGIC-COOKIE
00000020: 2d31 0010 1fba cba8 1f6a f8b6 e00d 8c1a  -1.......j......
00000030: c7cb 7d86 0100 0006 6465 6269 616e 0001  ..}.....debian..
00000040: 3000 124d 4954 2d4d 4147 4943 2d43 4f4f  0..MIT-MAGIC-COO
00000050: 4b49 452d 3100 1050 f7f6 b85b 77e1 49e4  KIE-1..P...[w.I.
00000060: a0c6 470d 7b11 a9                        ..G.{..

如何解決?

Invalid MIT-MAGIC-COOKIE-1 keyxhost: unable to open display ":0"

這實際上是在同一行列印出的兩條錯誤消息:

Invalid MIT-MAGIC-COOKIE-1 key
xhost: unable to open display ":0"

當您使用 X11 GUI 登錄時,該會話會自動獲得一個DISPLAY環境變數和一個特定於會話的訪問密鑰(儲存在環境變數~/.Xauthority指定的文件中或文件中XAUTHORITY)。

控制台登錄與 GUI 登錄是分開的,因此控制台登錄會話不會自動獲得任何這些。xhost除非您首先有權訪問 GUI 會話,否則您不能使用它來配置 GUI 會話的訪問控制。

當 GUI 會話結束並重新啟動 X11 伺服器時,會在 X11 伺服器端生成一個新的會話密鑰,這會自動使之前的密鑰失效。但是舊的會話密鑰可能會留在使用者的.Xauthority文件中。它將在下次 GUI 登錄期間自動替換。因此,文件中存在 MIT-MAGIC-COOKIE-1 密鑰.Xauthority並不意味著它一定是目前密鑰。

如果您執行pgrep -a Xorg,您可能會看到 X 伺服器程序的命令行參數類似於Xorg -nolisten tcp -auth <some path> <other options...>. 該-auth選項指定的路徑是目前伺服器端會話密鑰文件:如果您有 root 訪問權限,您可以使用 eg 查看它xauth -f <some path> list並將其與您自己.Xauthority文件的內容進行比較,最好使用xauth list. 輸出將是這樣的一行或多行:

debian/unix:0  MIT-MAGIC-COOKIE-1  <actual key in hexadecimal>

伺服器端密鑰文件應該總是正好有 1 行,但是如果您使用 SSH 連接和 X11 轉發,您自己的.Xauthority文件中可能有其他行,以 egdebian/unix:10或更高的顯示數字開頭。

如果文件的xauth list輸出.Xauthority包含與 顯示的單行完全匹配的行xauth -f <some path> list,則您將能夠訪問 X 伺服器;如果沒有匹配的行,X 伺服器將拒絕您的請求並Invalid MIT-MAGIC-COOKIE-1 key報錯。

我猜您的 或任何類似的登錄腳本中可能有 一個命令xhost。您應該將它包裝在一個測試中,該測試將在執行之前測試變數的存在,而不是例如:~/.profile``~/.bashrc``$DISPLAY``xhost

xhost +local:

你會有例如

if [ "$DISPLAY" != "" ]
then
   xhost +local:
fi

但是,如果使用該~/.Xauthority文件的預設位置,並且您這樣做只是為了在用於獲取 root 訪問權限時允許使用 GUI 管理工具sudo,則可能有一種更安全的方法。而不是添加xhost +local:(= 允許每個人,例如 SSH 到同一主機訪問您的 GUI 會話),您可以添加類似這樣的內容到您的~/.bashrc

if [ "$SUDO_USER" != "" ] && [ "$DISPLAY" != "" ]
then
   export XAUTHORITY=$(grep "^${SUDO_USER}:" /etc/passwd | cut -d : -f 6)/.Xauthority
fi

這不是放鬆 GUI 會話的安全性,而是使用 root 可以讀取所有內容的事實(因此,如果您的主目錄是使用選項導出的 NFS 掛載,它將不起作用root_squash)。當您使用sudo時,它會將XAUTHORITY變數設置為直接指向.Xauthority您個人使用者帳戶主目錄中的文件。

sudo su -(此外,如果您使用.代替,則此技巧不起作用sudo -i,並將類似的片段添加到/root/.bashrcor /root/.profile。但在編輯這些文件時要小心:一個不幸的錯誤可能會使再次獲得工作的 root shell 變得非常困難。)

引用自:https://unix.stackexchange.com/questions/649651