“su” 错误“X11 连接因身份验证错误而被拒绝”

Ste*_*n M 62 bash gnu-screen su xauth

作为 root,我连接到远程主机以执行命令。只有“standarduser”具有适当的 id 文件和正确的 .ssh/config,所以我首先切换用户:

su standarduser -c 'ssh -x remotehost ./remotecommand'
Run Code Online (Sandbox Code Playgroud)

该命令工作正常,但尽管我使用了“-x”(禁用 X11-Forwarding)并在 中禁用了 X11Forwards /etc/ssh/ssh_config,但我仍然收到错误消息:

X11 connection rejected because of wrong authentication.
Run Code Online (Sandbox Code Playgroud)

当我以“standarduser”身份登录时,我没有收到错误消息。

这很烦人,因为我想将该命令集成到 cron 作业文件中。我知道错误消息指的是 root 的 .XAuth 文件的错误身份验证,但我什至没有尝试通过 X11 进行连接。

为什么“ssh -x”没有禁用 X11 连接并抛出错误消息?

更新:该消息仅在我在屏幕内登录时显示,当在本地机器本身(无屏幕)上使用上述命令时,我没有收到错误消息,所以这对 cron 也应该没问题.

我也启动了相同的命令,-v并且意外地得到了错误消息 FIRST,甚至在来自 SSH 的状态信息之前:

root@localhost:~# su standarduser -c 'ssh -x remotehost ./remotecommand'
X11 connection rejected because of wrong authentication.
OpenSSH_6.2p2 Ubuntu-6ubuntu0.1, OpenSSL 1.0.1e 11 Feb 2013
Run Code Online (Sandbox Code Playgroud)

这让我想到了问题本身,不是ssh抛出错误消息的原因,而是su

root@localhost:~# su standarduser -c 'echo Hi'
X11 connection rejected because of wrong authentication.
Hi
Run Code Online (Sandbox Code Playgroud)

为什么我只在 内收到此错误screen?如何禁用此错误消息?

Neu*_*ter 93

好像你根本缺乏一些X11魔法饼干.Xauthority,你的standarduser了。这是解决此问题的方法。

简短版本(感谢@bmaupin

standarduser@localhost:~$ xauth list | grep unix`echo $DISPLAY | cut -c10-12` > /tmp/xauth
standarduser@localhost:~$ sudo su
root@localhost:~$ xauth add `cat /tmp/xauth`
Run Code Online (Sandbox Code Playgroud)

注意:检查反引号!它们不能用引号代替!您需要sudo安装才能进一步执行第二个命令!

原版长版

要解决问题,首先要检测standarduser使用哪个显示编号:

standarduser@localhost:~$ echo $DISPLAY
localhost:21.0
Run Code Online (Sandbox Code Playgroud)

在这种情况下是21.0。其次,显示standarduser的cookies列表:

standarduser@localhost:~$ xauth list
localhost/unix:1  MIT-MAGIC-COOKIE-1  51a3801fd7776704575752f09015c61d
localhost/unix:21  MIT-MAGIC-COOKIE-1  0ba2913f8d9df0ee9eda295cad7b104f
localhost/unix:22  MIT-MAGIC-COOKIE-1  22ba6595c270f20f6315c53e27958dfe
localhost/unix:20  MIT-MAGIC-COOKIE-1  267f68b51726a8a381cfc10c91783a13
Run Code Online (Sandbox Code Playgroud)

用于21.0显示的 cookie是列表中的第二个并以104f.

最后要做的是将此特定 cookie 添加到根目录的.Xauthority. 以 root 身份登录并执行以下操作:

root@localhost:~$ xauth add localhost/unix:21  MIT-MAGIC-COOKIE-1  0ba2913f8d9df0ee9eda295cad7b104f
Run Code Online (Sandbox Code Playgroud)

这是你如何减轻了X11 connection rejected because of wrong authentication当您运行错误su,如bash脚本或不同的用户screen

感谢这位大佬的启发。

  • 效果很好!我缩短了一点: 1. ``xauth list|grep unix`echo $DISPLAY|cut -c10-12` > /tmp/xauth`` 2. `sudo...` 3. ``xauth add `cat / tmp/xauth``` (2认同)
  • 长版本工作起来就像一个魅力,但短版本在 centos 上出错,显示“xauth:(argv):1:错误的“add”命令行” (2认同)

小智 50

一个更简单的解决方案:

1.- ssh user@host

2.- $ sudo --preserve-env=DISPLAY -s

3.- # xauth merge /home/user/.Xauthority

就这样

  • tdc,这只是一个警告,而不是错误,xauth 将创建该文件 - 如果您第二次运行该命令,您将看不到它。 (4认同)
  • 这对我来说不是开箱即用的,因为`xauth: file /root/.Xauthority does not exist` (3认同)

小智 8

我的需求略有不同,所以我想出了一个略有不同的解决方案。我需要能够以另一个用户(非 root 用户)身份运行 X11 应用程序。运行 CentOS,所以我没有像 ubuntu 幸运的狗那样使用 Xauth 魔法的可爱的 gksudo 工具。

我真的不想为了登录、切换用户和运行应用程序而编写一些自定义脚本;这对我来说似乎有点多余。

步骤1:

允许在 sudo 会话中携带 $XAUTHORITY。

在 /etc/sudoers 中其余 env_keep 语句下添加此行:

Defaults    env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Run Code Online (Sandbox Code Playgroud)

第二步:

让您的目标用户能够读取您的 .Xauthority(是的,我知道,尖叫安全!随心所欲)。对于那些只想以 root 身份运行命令的人,可以跳过这一步。

目标用户与我共享同一个组,所以我只需打开组读取权限:

$ chmod g+r user ~/.Xauthority
Run Code Online (Sandbox Code Playgroud)

第三步:

默认情况下,CentOS 不会填充 $XAUTHORITY 的值。在您的个人资料中添加一行(我的是 ~/.bash_profile):

export XAUTHORITY=$HOME/.Xauthority
Run Code Online (Sandbox Code Playgroud)

就是这样。没有更多的调整。无需编写 .XML 即可使 PolicyKit 工作。每次登录都没有运行脚本。无需两次 sudo 即可复制 xauth。从现在开始,您可以简单地:

$ sudo -u user xcalc
Run Code Online (Sandbox Code Playgroud)

适用于 MobaXTerm。