在尝试通过 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
解决问题的替代方法
我看到这篇文章的标题是: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
对我来说,分两步:
- 创建了一个新用户。以新用户身份登录并使用 feh 等命令尝试 X 转发。
- 以旧用户身份重新登录并使用新用户的 ~/.Xauthority 文件替换旧的 ~/.Xauthority。