以其他用户身份登录后,如何运行 GUI 程序?
thufir@doge:~$
thufir@doge:~$ sudo -u hawat -i
hawat@doge:~$
hawat@doge:~$ whoami
hawat
hawat@doge:~$
hawat@doge:~$ pwd
/home/hawat
hawat@doge:~$
hawat@doge:~$ echo $HOME
/home/hawat
hawat@doge:~$
hawat@doge:~$ firefox
No protocol specified
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :0
hawat@doge:~$
答案1
export DISPLAY=:0
对我有用。请确保在连接系统上执行该命令,而不是在您正在连接的系统上执行该命令!
答案2
这个答案适用于我的 Ubuntu 16.04 和 Mir(略有改动):
包装器 bash 脚本:
为了方便,我创建了一个包装器 bash 脚本,您可能想要下载/usr/local/bin/xsudo
并标记为可执行文件(chmod +x /usr/local/bin/xsudo
)。
然后只需运行:
xsudo hawat firefox
潜在的替代方案:
- 作为一种更简单的替代方法,您可以研究
pam_xauth
(s。这个答案)然而出于某些原因,这对我来说不起作用。(我仍然收到有关 Firefox 无法连接到显示器的错误:0) - 在很多论坛中,你可能会看到
xhost +local:
类似这样的命令,将要gksudo -u hawat firefox
无需任何包装脚本即可工作。然而请注意,这将打开一个安全漏洞:您本地主机上的任何活动用户都能够访问您的键盘、鼠标、屏幕等。 - 过去有糟糕,由于某种原因,它已停止使用 - 但您可能仍可以下载并使用它。据我所知,它的功能与我的脚本类似,只是功能更多。不幸的是,我无法找出为什么不再维护它。(可能是因为我们现在应该改用 pam_xauth - s. 第一个替代方案)
答案3
在此问题上花费了太多时间之后,我发现在 Ubuntu 16.04 上的 Gnome 中,正确的值是DISPLAY=:1
,而不是DISPLAY=:0
像以前那样。
答案4
导出显示=:0工作正常,但这是一个临时解决方案,因为您每次打开终端时都需要输入此内容。
永久解决方案: 问题可能是由于 /etc/sudoers 中的 env_keep 变量引起的。使用 gedit 在 /etc/sudoers 末尾添加以下行,或使用须藤维须藤
默认 env_keep+="DISPLAY"
笔记 : 请记住始终使用"+="同时添加到 env_keep。如果还有其他 env_keep 具有"="将其更改为"+="因为使用"="将覆盖其他值。