![允许用户运行带参数的命令(包含空格)](https://linux22.com/image/6945/%E5%85%81%E8%AE%B8%E7%94%A8%E6%88%B7%E8%BF%90%E8%A1%8C%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E5%91%BD%E4%BB%A4%EF%BC%88%E5%8C%85%E5%90%AB%E7%A9%BA%E6%A0%BC%EF%BC%89.png)
我想允许一名用户运行 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
- 编写脚本(只能由 root 编写)
- 在该脚本中,执行
grep
您需要的 - 在 sudoers 配置中,仅允许访问该脚本
- 配置任何工具或建议任何用户通过 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 来访问文件,请考虑使用cat
或tee
类似的东西,并将其通过管道传输到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
.