如何解决 su 用户的“未指定协议”

J C*_*ins 27 ubuntu gui not-root-user

我正在尝试使用备用用户(非管理员)在我的系统上执行图形软件。此备用用户已被命名并赋予 UID 和 GID 以匹配同名的远程系统用户。UID 是 500,所以我相信这会使用户成为“非登录”用户。

从登录到我的主帐户的 Ubuntu 开始,我打开一个终端并su转到备用用户。然后我尝试执行命令以启动应用程序并收到“未指定协议”。

这是因为 UID <1000,su还是因为用户的非管理员?如何让该用户使用 GUI 执行应用程序?

Cel*_*ada 23

由于用户的 UID,问题不会发生。500 作为 UID 就好了,除了在一些显示管理器的默认设置中,该 UID 并没有使它成为“非登录”用户。

错误消息No protocol specified听起来像是特定于应用程序的错误消息,而且没有帮助,但我猜测该错误是该应用程序无法联系您的 X11 显示器,因为它没有权限这样做所以因为它以不同的用户身份运行。应用程序需要一个“魔法 cookie”(秘密令牌)才能与 X11 服务器通信,这样系统上在其他用户下运行的其他进程就无法侵入您的显示器、创建窗口和窥探您的击键。其他系统用户无权访问此魔法 cookie,因为权限设置为只有启动桌面环境的用户才能访问(这是应该的)。

试试这个,以您的原始用户身份运行,将 X11 cookie 复制到另一个帐户:

su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"
Run Code Online (Sandbox Code Playgroud)

然后运行您的应用程序。您可能还需要XAUTHORITY在该 shell 中取消设置。该命令xauth list从您的主用户处提取魔法 cookie ( ) 并将其添加 ( xauth add) 到其他用户可以获取的位置。

  • @JCollins 您每次注销并登录后都必须重做,因为每次都会生成一个全新的魔法饼干。这是正常的,它是安全模型的一部分。 (2认同)

MAD*_*ppy 18

就我而言,新的显示服务器协议wayland是问题所在,

只要这样做,xhost + local:其他用户(例如root)就可以在您的会话中运行程序,但是不允许网络连接。

如果您想允许来自任何主机的客户端,则可以使用xhost +而无需指定任何主机。然而这是不安全的,最好只指定要授予其会话访问权限的主机。


Car*_*ood 8

假设你想用蛮力让自己与 X 建立联系......

让我们假设您已经在服务器上运行您的命令(X 运行的地方),否则首先让它工作,然后从客户端使用 'ssh -X user@server' ;)。

可能有多种方法可以运行 xauth 命令,例如,您可能正在使用“sudo”,但这可能会丢失或更改环境变量。需要保留以下环境变量:DISPLAY 和 XAUTHORITY。要测试是否是这种情况,您可以以与运行命令相同的方式运行 'echo $XAUTHORITY',但请确保在运行这些命令之前没有扩展环境变量。例如,尝试: sudo bash -c 'echo "$XAUTHORITY"' 以查看运行 sudo 后 XAUTHORITY 的真正含义(如果它消失了,您可能需要在 sudoers 文件中添加一些内容,请参阅其他地方)。

最后,以您想要访问的用户身份在服务器上运行以下命令:

xauth info

这将显示将使用的“权威文件”(默认情况下为 /root/.Xauthority,对于 root,或类似 /home/theuser/.Xauthority)。如果它显示正确的 .Xauthority 文件,那么您实际上不必担心 XAUTHORITY 环境变量(实际上,我不知道它何时不会,除非您想操作该文件的非标准位置)。

删除该文件(如果它甚至存在):

rm /root/.Xauthority

替换/root/.Xauthority为适合您案例的正确 XAUTHORITY 文件。

重新创建它,但为空(很多命令都需要这样做):

touch /root/.Xauthority

此时,即使您之前收到无效的 MIT-MAGIC-COOKIE-1,您也会收到No protocol specified错误。找到目前X服务器使用的权限文件:

ps aux | grep Xorg

这应该显示如下:

root 1153 0.0 1.0 149560 44464 tty7 Ss+ dec02 0:00 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711} -background none -noreset -displayfd 17 vt7

后面的文件名-auth是您在下一个命令中需要的。以 root 身份运行:

sudo xauth -f '/var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711}' list

这列出了一个 32 位的十六进制密钥。例如,输出可能是:

hostname/unix:0 MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

使用它来生成您的 .Xauthority 文件(作为需要再次登录的用户):

xauth add $DISPLAY MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7

用 list 命令为您返回的内容替换“c0eaf749aa252101a0f57d5087089db7”。现在你的 .Xauthority 应该是 51 字节,你可以连接到 X 服务器(再次)。