可以在sudo'ing之前检查sudo的功能吗?


11

我正在编写一个小型实用程序。我希望它可以尝试sudo在需要时运行某些程序。

那就是:如果文件许可不允许当前用户对特定文件进行操作(sudo规则会允许它),我希望我的实用程序以sudo文件所有者的身份运行某些文件。

我希望事先检查一下此功能,因为我希望系统日志不会充满sudo尝试失败带来的噪音。由于sudo自身故障时的报道:“这件事会报”。

因此,我希望以编程方式检查:可以通过?user <x>运行。command <y>sudo

问题在于:尽管/etc/sudoers包含该映射,但它是根目录拥有的,普通用户无法读取。

我正在考虑产生一个要运行的子进程sudo -l(该子进程输出当前用户可以sudo运行的命令)。然后,我将解析此输出。但是,这似乎有些脆弱。输出包含我想要的信息,但它似乎是供人类阅读的(而不是供程序使用)。我不知道是否可以保证将来输出的格式相同或跨平台使用。

以编程方式解析sudo -l输出是否安全?如果没有,是否有更好的选择来提前确定sudo命令是否成功?


(X / Y上的背景:此实用程序供受限访问角色帐户使用。我希望其他一些用户有效地选择加入,以允许受限访问帐户通过sudo规则对其文件进行操作。但是,我赢了无法提前知道其他哪些用户已设置了相关的sudo规则)


3
我建议您采取略有不同的方法。与其制定每个用户的规则,不如让一个允许其执行您想要做的事情的组。这样,您可以简单地检查用户是否在组中。那会是一个体面的选择吗?
terdon

Answers:


13

根据sudo手册页:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

所以这归结为

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

正如穆鲁,兼用指出,-U $USER-U $USERTOTEST有或全无,这取决于你的需要。


如果您打算$USER表示当前用户,则可以sudo -l <command>不使用-U $USER
muru 2016年

谢谢-这很有用。有一件事我也注意到在测试这种方法的缺点是它似乎没有照顾在sudo的规则已被设置为允许特别例外,如所有命令的情况下(targetUser) ALL, !/usr/bin/foo 。在这种情况下,sudo -l -u targetUser /usr/bin/foo仍然出现输出/usr/bin/foo和退出状态为0。不过,对于我的简单检查而言,基本上就足够了,它可以解析更详细的sudo -l输出。
彼得·马丁
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.