为什么我从 xauth 收到此消息:“锁定权限文件 /home/<user>/.Xauthority 超时”?

slm*_*slm 45 remote-management x11 xauth

在尝试通过 SSH 连接到主机时,我收到了以下消息xauth

/usr/bin/xauth: 锁定权限文件 /home/sam/.Xauthority 超时

注意:我试图通过 SSH 连接远程显示 X11 GUI,因此我需要xauth能够$HOME/.Xauthority成功创建文件,但正如该消息所指示的那样,显然不是。

尝试运行任何基于 X11 的应用程序,例如xeyes收到此消息:

$ xeyes
X11 connection rejected because of wrong authentication.
Error: Can't open display: localhost:10.0
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

slm*_*slm 53

stracexauth发生故障的远程系统上运行将向您显示发生了什么故障xauth

例如

$ strace xauth list
stat("/home/sam/.Xauthority-c", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
open("/home/sam/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 EEXIST (File exists)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, 0x7fff6c4430e0)       = 0
open("/home/sam/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 EEXIST (File exists)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, 0x7fff6c4430e0)       = 0
open("/home/sam/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 EEXIST (File exists)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
Run Code Online (Sandbox Code Playgroud)

所以xauth试图打开一个文件并且它已经存在。罪魁祸首是/home/sam/.Xauthority-c. 我们可以确认这个文件在远程系统上的存在:

$ ls -l .Xauthority*
-rw------- 1 sam sam 55 Jul 12 22:04 .Xauthority
-rw------- 1 sam sam  0 Jul 12 22:36 .Xauthority-c
-rw------- 1 sam sam  0 Jul 12 22:36 .Xauthority-l
Run Code Online (Sandbox Code Playgroud)

修复

事实证明。这些文件是 的锁定文件.Xauthority,因此只需删除它们即可解决问题。

$ rm -fr .Xauthority-*
Run Code Online (Sandbox Code Playgroud)

删除文件后,退出 SSH 连接,然后重新连接。这将允许xauth成功重新运行。

$ ssh -t skinner ssh sam@blackbird
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-44-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

Last login: Sun Jul 12 22:37:54 2015 from skinner.bubba.net
$
Run Code Online (Sandbox Code Playgroud)

现在我们可以xauth list毫无问题地运行X11 应用程序。

$ xauth list
blackbird/unix:10  MIT-MAGIC-COOKIE-1  cf01f793d2a5ece0ea58196ab5a7977a
Run Code Online (Sandbox Code Playgroud)

图形用户界面

$ xeyes
Run Code Online (Sandbox Code Playgroud)

                                              SS#1

解决问题的替代方法

我看到了这篇题为:xauth:锁定权限文件错误 .Xauthority [linux, ssh, X11] 的帖子其中提到了使用xauth -b来破坏任何可能挂起的锁定文件。xauth的手册页似乎支持这一点:

 -b      This option indicates that xauth should attempt to break any
         authority file locks before proceeding.  Use this option only to
         clean up stale locks.
Run Code Online (Sandbox Code Playgroud)

参考

  • 在删除权限文件之前,您可能需要修复 SELinux 问题。见 http://froebe.net/blog/2015/01/20/linux-selinux-xauth-timeout-in-locking-authority-file-xauthority-solved/ (2认同)

gue*_*tli 14

问题的根源可能是您在 $HOME 目录中没有写权限。

这就是我收到这条消息的原因:

/usr/bin/xauth: 锁定权限文件超时 /home/fooftp/.Xauthority

这是我检查权限的方式:

fooftp@for-fun-work:~> ls -l .Xauthority 
-rw-r--r-- 1 fooftp fooftp 1 Sep 14  2015 .Xauthority
# Conlusion: I can write this file: ok

fooftp@for-fun-work:~> rm .Xauthority
rm: cannot remove '.Xauthority': Permission denied
# Conlusion: strange ... I can't delete it 

fooftp@for-fun-work:~> id
uid=1001(fooftp) gid=1000(fooftp) groups=1000(fooftp)
# Conlusion: Yes, I am user fooftp

fooftp@for-fun-work:~> ls -ld .
dr-xr-xr-x 14 fooftp fooftp 4096 Sep 14  2015 .
# Conlusion: Bug found :-)
# The permissions should be "rwx" for you.
Run Code Online (Sandbox Code Playgroud)

如果这是问题所在,那么您需要确保您对 $HOME 具有写权限:

chmod u+rwX $HOME
Run Code Online (Sandbox Code Playgroud)


sea*_*e27 5

在我弄清楚问题之前,我对困扰我的问题有另一个答案。这个问题是 Fedora 操作系统及其衍生产品中的一个错误,正如我后来发现的那样。如果问题与接受的答案不同,和/或您不在 Fedora、RedHat、Korora 等上,那么这对您没有帮助。

问题

正如用户 slm 所说,运行 strace 会给你一个问题的指示,但在这个特定的 bug 的情况下,输出是不同的:

$ strace xauth list
  ...
  stat64("/home/USER/.Xauthority-c", 0xbff23280) = -1 ENOENT (No such file or directory)
  open("/home/USER/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
  rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
  rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
  rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
  nanosleep({2, 0}, 0xbff232c8)           = 0
  open("/home/USER/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
  rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
  rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
  rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
  nanosleep({2, 0}, 0xbff232c8)           = 0
  open("/home/USER/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
  ...
Run Code Online (Sandbox Code Playgroud)

需要明确的是,这表明 EACCES 返回代码,即权限被拒绝。这与用户 slm 的问题不同,他有 EEXIST 返回码,这意味着文件存在。因此,对于 EACCES 返回码,显然您首先要检查的是:是否设置了我的主目录权限,以便我能够写入主目录?您应该首先验证您的主目录上是否为您自己的用户设置了写入标志。如果你这样做了,那么你可能是下面描述的错误的受害者。

错误

通过几次谷歌搜索,我终于找到了有类似问题的人,这让我找到了 Fedora 错误报告。对于那些关心阅读它的人:https : //bugzilla.redhat.com/show_bug.cgi?id=772992

解决方法

问题的解决方法:

#verify you're not crazy
$ xauth list
  /usr/bin/xauth:  timeout in locking authority file /home/USER/.Xauthority
#use restorecon to reset it all
$ /sbin/restorecon -v -v /home/USER/.Xauthority 
$ /sbin/restorecon -v -v -R /home/USER/
#log out of the remote system
$ exit
Run Code Online (Sandbox Code Playgroud)

当您通过 SSH 重新登录时,此时应该没问题,您应该能够再次成功传输 X 会话。


编辑(和其他替代解决方法):

为了尽可能完整,其他用户确实在错误报告中指出上述修复对他们不起作用 - 它恰好对我有用。解决该问题的另一种尝试是(我没有亲自验证此解决方法):

# setsebool -P use_nfs_home_dirs 1
Run Code Online (Sandbox Code Playgroud)

另一个人提到了一些关于 GDM 的事情,我对它的了解为零。如果这与您有关,我建议您阅读他在 BugZilla 中的帖子,看看他的评论对您是否有意义。