【问题标题】:How can I allow bash -c for sudoers (followed by multiple commands)?如何允许 bash -c 用于 sudoers(后跟多个命令)?
【发布时间】:2014-09-02 12:42:17
【问题描述】:

我在 /etc/sudoers 中有这个:

%wheel myhostname =NOPASSWD: /bin/bash -c "echo foo && echo bar", \
                             /bin/bash -c echo foo

执行sudo /bin/bash -c echo foo 不会被提示输入密码。

但是,sudo /bin/bash -c "echo foo && echo bar" 仍然要求输入密码。

我已经尝试了很多种变体,但没有被接受。

哪里出错了? / 如何允许 -c 后跟多个命令?

【问题讨论】:

  • 一个明显的解决方法:将其称为 /usr/local/bin 中的脚本并在 /etc/sudoers 中引用该脚本 :)
  • @user3159253 这是我目前的方法 - 我想摆脱它:)
  • 嗯,最明显的解决方案通常是最好的 :) sudoers 手册页提到要传递给 shell 的特殊符号应该受到反斜杠保护,但我在你的命令。
  • 附加文件会使我的设置复杂化,因为受影响的脚本不止一个,而且还有多台机器。我还用sudo /bin/bash -c \"echo foo && echo bar\" 进行了测试 - 没有成功。
  • 你试过\&\&吗?

标签: bash sudo sudoers


【解决方案1】:

问题在于你的 shell 如何解释参数。如果我在 bash 中(大多数其他 shell 的工作方式相同),然后我输入命令

sudo /bin/bash -c "echo foo && echo bar"

sudo 被调用,其后的所有内容都作为参数。但是,shell 在将每个参数传递给sudo 之前对其进行处理。它所做的其中一件事是删除引用参数周围的引号。因此,sudo 作为其argv 值获取的参数是一个如下所示的数组(每行一个参数):

/bin/bash
-c
echo foo && echo bar

sudo 将这些与空格结合起来,并将其与 sudoers 文件中的命令进行比较(实际上它比这更复杂,因为它会替换通配符等)。因此,为了检查权限,它实际看到您执行的命令是

/bin/bash -c echo foo && echo bar

当我将该命令放入我的 sudoers 文件时,我在输入时不会提示输入密码

sudo /bin/bash -c "echo foo && echo bar"

但是,当我输入任何这些命令或其他类似命令时,也不会提示我输入密码。

sudo /bin/bash "-c echo foo && echo bar"
sudo /bin/bash "-c echo" foo "&& echo" bar
sudo /bin/bash -c echo "foo && echo" bar

一般来说,据我所知,sudo(或任何程序)无法确切地知道输入了什么命令,只能知道它被 shell 转换为什么执行目的。

【讨论】:

  • 很好的解释。谢谢!
【解决方案2】:

至少对于我的sudo(OS X 10.9,sudo 1.7.10p7),/etc/sudoers 中的引号是字面匹配的。也就是说,指定

/bin/bash -c "echo foo && echo bar"

意味着用户必须运行

sudo /bin/bash -c '"echo foo && echo bar"'

即引号必须传递给程序。

因此,您只需在 /etc/sudoers 中去掉引号即可:

%wheel myhostname =NOPASSWD: /bin/bash -c echo foo && echo bar

虽然这看起来有点奇怪,但它完全可以在我的机器上运行:用户可以在没有密码的情况下执行/bin/bash -c "echo foo && echo bar"。这是因为,根据man sudoers,唯一必须转义的字符是',', ':', '=' and '\'

请注意,这意味着sudo 基本上是将所有命令行参数与空格连接在一起以确定匹配:用户也可以执行/bin/bash -c "echo foo" "&&" "echo bar"。因此,您必须注意任何参数都不能单独构成安全风险(例如,foo&&bar 不是可用于利用您的计算机的东西)。

【讨论】:

  • 谢谢。我向@Austin 提供了赏金以寻求他的解释并接受了您的回答,因为对于寻求解决方案的其他人来说,这是“快速阅读”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多