我正在尝试使用备用用户(非管理员)在我的系统上执行图形软件。该备用用户已被命名并被赋予 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
再试一次