允许用户运行带有参数的命令(其中包含空格)


17

我想允许一个用户运行grep(通过sudo),并在一个特定文件中为一个特定字符串进行grep。我不想让该用户能够在所有文件上运行grep。用户没有对该文件的读取访问权限,因此需要使用sudo。我正在尝试编写nagios检查,以检查计算机上另一项服务的日志文件。

但是它不起作用,sudo不断要求输入密码。

我的命令是:(sudo grep "string I want (" /var/log/thefilename.log是的,(我要grep的字符串中有一个原始字符和一些空格)

/etc/sudoers.d/user-can-grep 具有以下内容:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

此sudoers文件由拥有root:root并拥有权限-r--r-----

该服务器是Ubuntu Trusty 14.04.3 LTS。

我该如何进行这项工作?


nagios检查是否显式调用/ bin / grep或/ usr / bin / grep?
杰夫·谢勒

编写一个执行此操作的shell脚本,然后通过运行该脚本sudo
user253751 '16

@JeffSchaller仅供参考,该脚本只会调用grep,并which grep告诉我它正在使用/bin/grep。sudo文件中的AFAIK即使您在没有完整路径的情况下调用它,也需要指定二进制文件的完整路径。
罗里

Answers:


13

显然,在将命令与sudoers文件中的规范进行比较之前,sudo将命令展平为字符串。因此,就您而言,您无需使用引号或任何其他转义形式:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

编辑:正如@ user23013在注释中指出的那样,此文件可被利用来对grep表示任何文件中的“我想要的字符串”(并且通过扩展名,还表示“字符串I”和“字符串”。)请在使用之前仔细考虑使用sudo的参数检查!


另请注意,以下调用是等效的,即您将无法将用户限制为一个特定的表示形式:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

这是由于以下事实:引号和转义由shell处理,并且永远不会到达sudo


有趣的是,我想知道这是否可以利用,即说服sudo您键入了一件事(与规范匹配),但是要执行它,则完全是另一回事。
AugustBitTony

4
@EightBitTony当然是!在您sudoersuser host = NOPASSWD: /usr/bin/vim Editing sudoers file(有意向让用户编辑“编辑sudoers文件”)可以通过利用cd“荷兰国际集团进入/etc/并运行sudo vim Editing sudoers file。我想说的是,对于任何具有合理复杂性的命令,都应该使用注释中建议的方法-shell提供了$@变量,您可以在其中检查参数是否按期望的方式进行分组。
Alexander Batischev '16

8
( /var/log任意位置创建路径并符号链接thefilename.log到任何文件,然后用户可以string I want从任何文件进行grep 。
user23013 '16

2
@EightBitTony的答案(编写包装器脚本,允许sudo访问该脚本)更好,更安全。
cas

哇,对于以安全为中心的工具来说,这是极其糟糕的做法。
山姆·沃特金斯

32
  1. 编写脚本(只能由root编写)
  2. 在该脚本中,执行grep您需要的
  3. 在sudoers配置中,仅允许访问该脚本
  4. 配置任何工具或建议任何用户通过sudo运行脚本

调试起来容易得多,锁定特定文件的特定访问权限也容易得多,利用起来也更加困难。


2

既然你只需要根文件访问,请考虑使用cattee或相似,管道,要的东西grep,你需要或任何程序运行。例如,通过sudo cat /file/path | grep …这种方式,您可以将root限制在绝对需要的地方。


0

sudo很棒,但有时并非最合适。为此,我喜欢使用supersuper还允许提升的权限,但是它采用命令别名,这在允许复杂命令行时非常方便,因为它们被用作简单命令行。

您的super.tab如下所示:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

并以调用super grepcmd


sudo具有Cmnd_Alias(可以包含一个或多个命令,带有或不带有arg限制)。
cas

完全不一样。Cmnd_Alias是用于简化配置文件的工具,它不会向用户公开别名,这是super的主要操作模式(这就是为什么在大多数情况下我都不使用别名命令或运行suid脚本时使用sudo的原因,以及这两个用例的super)。
hildred '16

这就是包装器脚本的用途……它们不仅限于单行脚本,也没有令人讨厌的报价问题。
cas
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.