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


15

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

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

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

Answers:


15

由于用户的UID,不会发生此问题。500作为一个UID很好,并且UID不会使它成为“非登录”用户,除非在一些显示管理器的默认设置看来。

错误消息“未指定协议”听起来像是一个特定于应用程序的错误消息,但那对您无济于事,但我猜测该错误是该应用程序无法联系您的X11显示器,因为它没有执行权限因此,因为它以其他用户身份运行。为了与X11服务器对话,应用程序需要一个“魔术cookie”(秘密令牌),以便在其他用户下运行的系统上的其他进程无法侵入您的显示器,创建窗口并监听您的按键。另一个系统用户无权访问该魔术cookie,因为设置了权限,因此只有启动桌面环境的用户才能访问它(应该如此)。

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

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

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


奇怪的是,使用引号引起的命令给出“ su:必须从终端运行”。但这在航站楼里……
J Collins

@JCollins尝试,xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$但要注意那里存在着可怕的比赛条件。
roaima

@JCollins糟糕,如果su要输入密码,那将是一个问题。试试这个新命令。
Celada 2015年

@Celada,黄金,请客。您能否详细说明该命令的功能以及执行的方式?也许可以解释为什么原来的化身没有?
J Collins

1
@JCollins每次注销并登录后都必须重做一次,因为每次都会生成一个全新的魔术cookie。正常,这是安全模型的一部分。
Celada 2015年

6

我的情况是新的显示服务器出wayland了问题,

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

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


1
就我而言xhost +就足够了
危险89年

1
@ danger89虽然可以正常工作,但如果您没有阻止远程访问的防火墙规则,则它允许任何主机连接到您的会话(并非每个发行版都具有拒绝所有传入请求的防火墙规则,例如ubuntu没有预先配置的规则来阻止访问服务器,例如用户可能要安装的samba或apache),因此对于新Linux用户而言,这可能会成为问题。我个人将访问权限限制为仅在保存方面
MADforFUNandHappy

3

试试这样的东西

$ export LOGIN_USER="Math"
$ su - $LOGIN_USER
$ sudo xhost local:$LOGIN_USER &>/dev/null

资源

:接受的答案对我不起作用


3

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

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

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

最终,在服务器上以您希望获得访问权限的用户身份运行以下命令:

xauth info

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

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

rm /root/.Xauthority

/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是下一个命令中需要的文件名。以根用户身份运行:

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服务器。


没有主题,这是一个问答网站,而不是论坛
Anthon

1

当我从新贵的脚本启动Selenium 3.3.1的实例,然后在Selenium中使用Chrome驱动程序时,出现此错误“未指定协议”。Selenium与X11以同一用户身份运行,并且DISPLAY shell环境变量已正确设置。有趣的是,当我使用Firefox驱动程序时未发生此错误。将upstart脚本内的XAUTHORITY shell环境变量设置为指向活动X11用户的$ XAUTHORITY的值可修复Chrome驱动程序的错误。

附带说明一下,错误“未指定协议”已被Chrome / Chrome驱动程序彻底掩盖,绝不容易找到。我注意到Chrome一直以的模式创建目录/tmp/.org.chromium.Chromium.*,但是它们很快就消失了。我设法注意到它们包含一个chrome_debug.log带有消息“无法打开显示”的文件。我认为这很奇怪,因为我已经验证了Selenium进程中是否有正确的DISPLAY,/proc/$pid/environ并且strace更彻底地检查了Selenium进程上的输出,这表明“未指定协议”最终使我想到了这个问题。

可以通过取消设置XAUTHORITY并尝试运行某些X11客户端来重现此错误。例如:

$ XAUTHORITY= xeyes
No protocol specified
Error: Can't open display: :0.0


0

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


0

利用已接受答案中的线索,我能够以不同的方式解决问题:

  1. 在有效的帐户(Xauth1)中找到Xauth文件
  2. 在没有(Xauth2)的帐户中找到Xauth文件
  3. 将Xauth1复制到Xauth2
  4. 更改Xauth2的权限

在代码中:

root@45c4933a8f1a:~# xauth info
Authority file:       /headless/.Xauthority
<snip>
root@45c4933a8f1a:~# su OtherUser
OtherUser@45c4933a8f1a:/headless$ xauth info
Authority file:       /home/OtherUser/.Xauthority
<snip>
OtherUser@45c4933a8f1a:/headless$ exit
exit
root@45c4933a8f1a:~# cp /headless/.Xauthority /home/OtherUser/.Xauthority 
root@45c4933a8f1a:~# chown OtherUser:OtherUser /home/OtherUser/.Xauthority
root@45c4933a8f1a:~# su OtherUser

0

让说您尝试访问GUI为用户2普通用户),那么你需要下载安装的用户界面为用户2

尝试遵循以下步骤:

root身份登录:

sudo su

测试x服务器:

xclock

如果您看到时钟正在运行,那就很好了,现在尝试运行以下命令:

xhost

结果应如下所示:

xhost SI:localuser:tri
# tri is my user name

现在让user2访问xhost

xhost +SI:localuser:user2

现在尝试再次登录到user2并尝试打开任何GUI程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.