问题在于你的 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 转换成什么来执行。