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

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

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

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

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

答案1

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

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

如果您想允许客户从任何主机xhost +,您可以在不指定任何主机的情况下使用。然而这是不安全的,最好只指定您想要授予会话访问权限的主机。

答案2

问题是不是由于用户的 UID 而发生。 500 作为 UID 就可以了,并且该 UID 不会使其成为“非登录”用户,除非在某些显示管理器的默认设置中。

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

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

su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"

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

答案3

假设你想用蛮力让自己与 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 环境变量(实际上,我不知道什么时候不会,除非您想操作该文件的非标准位置)。

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

mv /root/.Xauthority /root/.Xauthority.bak

当然,在上面的命令中,替换/root/.Xauthority为适合您情况的正确 XAUTHORITY 文件。

重新创建它,但为空(这是很多命令所需要的):

touch /root/.Xauthority

此时你会得到未指定协议错误,即使你得到了无效的 MIT-MAGIC-COOKIE-1前。找到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

将 'c0eaf749aa252101a0f57d5087089db7' 替换为 list 命令返回的内容。现在您的 .Xauthority 大小应为 51 字节,您可以(再次)连接到 X 服务器。

PS 如果你/usr/bin/startx像我一样通过运行启动 Xorg;那么你可能会看到类似的东西:

root        1652  0.0  0.0  12788  5792 ?        Ss   jan20   0:00 login -- carlo
carlo       1834  0.0  0.0   8140  3468 tty1     Ss   jan20   0:00  \_ -bash
carlo       1887  0.0  0.0   7404  3236 tty1     S+   jan20   0:00      \_ /bin/sh /usr/bin/startx
carlo       1905  0.0  0.0   3912   828 tty1     S+   jan20   0:00          \_ xinit /home/carlo/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.WWPpq4OSlA
root        1906  1.2  0.7 25576848 235104 tty1  Sl   jan20 207:56              \_ /usr/lib/Xorg -nolisten tcp :0 vt1 -keeptty -auth /tmp/serverauth.WWPpq4OSlA
carlo       1917  0.0  0.0 143408 10884 tty1     Sl   jan20   0:00              \_ startplasma-x11

并且/tmp/serverauth.WWPpq4OSlA被删除了。请参阅/usr/bin/startx脚本了解其工作原理:

mcookie=`/usr/bin/mcookie`
xserverauthfile=`mktemp -p /tmp serverauth.XXXXXXXXXX`
trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM
xauth -q -f "$xserverauthfile" << EOF
add :$dummy . $mcookie
EOF

xauth -q << EOF
add $displayname . $mcookie
EOF

将随机 cookie 添加到用户.Xauthority文件中。

在这种情况下,cookie 就完全消失了。唯一可以取回它的地方是 Xorg 进程的内存 (RAM);但我懒得弄清楚如何恢复它。当然,只需重新启动 X 就应该.Xauthority使用新的 cookie 重新生成文件,并使用相同的 cookie 重新启动服务器。

答案4

只需在终端中输入此内容xhost +SI:localuser:root,然后export DISPLAY=:0.0再试一次

相关内容