我正在编写一个小型实用程序。如果需要的话,我希望它尝试sudo
运行一些东西。
也就是说:如果文件权限不允许当前用户对特定文件进行操作(并且sudo
规则允许),我希望我的实用程序sudo
以文件所有者的身份运行某些内容。
我希望事先检查此功能,因为我希望系统日志不会充满失败sudo
尝试的噪音。正如sudo
其本身在失败时的报告:“此事件将被报告”。
所以,我希望以编程方式检查:可以通过user <x>
运行吗?command <y>
sudo
问题是:虽然/etc/sudoers
包含该映射,但它是 root 拥有的并且普通用户无法读取。
我正在考虑生成一个子进程来运行sudo -l
(它输出当前用户可以 sudo 运行的命令)。然后我会解析它的输出。然而,这似乎有点脆弱。输出包含我想要的信息,但它似乎是为人类阅读而设计的(而不是为了程序化消费)。我不知道是否可以保证将来的输出遵循相同的格式,或者跨不同的平台。
以编程方式解析sudo -l
输出是否被认为是安全的?如果没有,是否有更好的选择来提前确定 sudo 命令是否会成功?
(X/Y 的背景:此实用程序供限制访问角色帐户使用。我希望其他一些用户有效地选择允许限制访问帐户通过 sudo 规则对其文件进行操作。但是,我赢了提前不知道哪些其他用户拥有相关的 sudo 规则)
答案1
根据 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
正如 Muru 所指出的,根据您的需要,使用或或不-U $USER
使用。-U $USERTOTEST