问题

问题

在尝试通过 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

我该如何解决这个问题?

答案1

strace在发生故障的远程系统上运行xauth将显示出什么问题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

尝试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

修复

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

$ rm -fr .Xauthority-*

删除文件后,退出 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
$

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

$ xauth list
blackbird/unix:10  MIT-MAGIC-COOKIE-1  cf01f793d2a5ece0ea58196ab5a7977a

图形用户界面

$ xeyes

                                              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.

参考

答案2

问题的根源可能是您在 $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.

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

chmod u+rwX $HOME

答案3

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

问题

正如用户 slm 所说,运行 strace 将为您提供问题的指示,但在这个特定错误的情况下,输出是不同的:

$ 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) 
  ...

需要明确的是,这表明 EACCES 返回代码,即权限被拒绝。这与用户 slm 的问题不同,用户 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

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


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

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

# setsebool -P use_nfs_home_dirs 1

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

答案4

对我来说,分两步:

  1. 创建了一个新用户。以新用户身份登录并使用 feh 等命令尝试 X 转发。
  2. 以旧用户身份重新登录并使用新用户的 ~/.Xauthority 文件替换旧的 ~/.Xauthority。

相关内容