Answers:
由于用户的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
)添加到其他用户可以获取它的位置。
xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$
但要注意那里存在着可怕的比赛条件。
su
要输入密码,那将是一个问题。试试这个新命令。
我的情况是新的显示服务器出wayland
了问题,
只是这样做,xhost + local:
然后允许其他用户(例如root)在您的会话中运行Programms,但是不允许网络连接。
如果要允许来自任何主机的客户端,则可以使用xhost +
而根本不指定任何主机。但是,这是不安全的,最好只指定要为其授予对会话的访问权限的主机。
xhost +
就足够了
假设您想蛮力让自己与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服务器。
当我从新贵的脚本启动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
这很简单。当您处于root状态并且想要使用gksu时,会发生问题。 只需退出 root状态,然后重试
利用已接受答案中的线索,我能够以不同的方式解决问题:
在代码中:
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