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

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

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

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

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

/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。

我怎样才能做到这一点?

答案1

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

更容易调试,更容易锁定对特定文件的特定访问,并且更难利用。

答案2

显然,sudo 在将命令与 sudoers 文件中的规范进行比较之前将命令扁平化为字符串。因此,在您的情况下,您不需要使用引号或任何其他形式的转义:

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

答案3

由于您只需要 root 来访问文件,请考虑使用cattee类似的东西,并将其通过管道传输到grep您需要运行的任何程序。例如,sudo cat /file/path | grep …通过这种方式,您可以将 root 限制在您绝对需要的地方。

答案4

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

你的 super.tab 看起来像:

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

并将被调用为super grepcmd.

相关内容