我知道有很多类似的问题,但它们都是关于 X-Forewarding 和 SSH 会话的。
我在具有特定脚本特权的本地用户身上遇到了这个问题......
问题
在 ubuntu 16.04 下我想要一个特定的用户客人能够运行一个特定的脚本/usr/sbin/测试.sh具有root权限(例如,该脚本进行一些系统设置和挂载)。
设置
我延长/etc/sudoers包含以下行的文件:
guest ALL = NOPASSWD: /usr/sbin/test.sh
guest
不是在sudo
小组里!(<-- 猜想这就是问题所在)
剧本
为了简单起见:
#!/bin/bash
zenity --info --text="Testing Sudo X"
如果执行sudo /usr/sbin/test.sh
如果以 sudo 组成员身份执行,或者没有对话框显示,则意味着:使终端窗口中的文本和操作正常运行)。
如果guest
登录(通过欢迎程序)并在 Unity 中启动一个新的 gnome-terminal 来执行,sudo /usr/sbin/test.sh
则会失败并出现错误(希望德语没问题):
No protocol specified
Failed to connect to Mir: Failed to connect to server socket: Datei oder Verzeichnis nicht gefunden
Unable to init server: Verbindung ist gescheitert: Verbindungsaufbau abgelehnt
(zenity:19225): Gtk-WARNING **: cannot open display: :0
我试过....
$DISPLAY
在之前或之中导出变量test.sh
cp
从.Xauthority
别人/home/user/
到我的guest
xauth add
生成另一个xauth list
用户的xauth cookie- 加入
Defaults env_keep += "DISPLAY"
/etc/sudoers
(这里犯了一个错误!!!)
问题/结论
这些都不起作用。我认为调试guest
通常不会有帮助,因为该命令使用 sudo 运行。所以我需要找到一种方法来为这个单个命令授予sudo或sudo 的guest
权限。$DISPLAY
.Xauthority
答案1
从 Ubuntu 16.04 开始,DISPLAY
不再位于 上:0
。 它位于一个数字上,该数字可能因同时登录到控制台的用户数量而异。
为了解决这个问题,您需要配置sudo
来保存DISPLAY
环境变量。
在目录中添加一个配置文件/etc/sudoers.d
,包含以下内容:
Defaults env_keep += "DISPLAY"
这将允许sudo
将环境变量传递DISPLAY
给它运行的程序,然后这些程序将能够连接到正确的DISPLAY
。
答案2
您需要安装 xhost
对于拱门:
sudo pacman -S xorg-xhost
然后运行:
xhost +