问题在于你的shell如何解释参数。如果我使用bash(大多数其他shell也是同样的工作方式),并输入以下命令:
sudo /bin/bash -c "echo foo && echo bar"
sudo
命令会将其后面的所有内容作为参数调用。但在传递到 sudo
前,shell 会处理每个参数。其中一件事情是移除带引号的参数周围的引号。因此,sudo
得到的参数数组(每行一个参数)如下:
/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转换后用于执行的命令。
sudo /bin/bash -c \"echo foo && echo bar\"
进行测试 - 但没有成功。 - user569825\&\&
吗? - BeniBela