【发布时间】:2021-10-01 19:06:34
【问题描述】:
我正在尝试通过 IPtables 管理来做一个 Web 界面。
我创建了一个文件,文件名为test.php
$output = shell_exec('bash /usr/bin/iptables.sh 2>&1');
echo $output;
我给了 /usr/bin/iptables.sh NOPASSWD 这样我就可以通过 apache 使用 sudo 执行该文件,而无需使用密码
sudo iptables -L
sudoers 文件:
apache ALL=(root) NOPASSWD: /usr/bin/iptables.sh
但我仍然收到以下错误:
我们相信您已经收到了本地系统的常规讲座 行政人员。它通常归结为以下三件事:#1) 尊重他人的隐私。 #2) 打字前三思。 #3) 有 强大的力量伴随着巨大的责任。 sudo:需要终端 读取密码;要么使用 -S 选项从标准读取 输入或配置 askpass 助手{"mode":"full","isActive":false}
但是,如果我使用
apache ALL=(root) NOPASSWD: ALL
一切正常。
我仔细检查了我的目录并使用了确切的路径
[root@CentOS bin]# readlink -f iptables.sh
/usr/bin/iptables.sh
这里超级无能,谁能帮我指路? :'(
【问题讨论】:
-
sudo 配置问题应该去 linux 管理支持站点。 SO 用于编程问题。
-
我看不到您的代码实际调用
sudo的位置。你的shell_exec命令调用的是bash,而不是/usr/bin/iptables.sh,所以即使有一个明确的sudo,它也不会匹配配置的路径。 -
通常,
/etc/sudoers配置有requiretty标志集(默认标志集在文件的前面,高于您引用的内容)。作为守护进程的子进程运行的程序通常没有控制 TTY。但是 sudoers 配置在这里是题外话,应该在 Unix & Linux 询问。 -
顺便说一句,请注意
shell_exec()如果您将其参数化以让远程用户配置任何内容,则很危险。一般来说,使用机制来启动一个外部可执行文件要安全得多,它允许您将显式参数向量指定为一个数组,而不是一个字符串,然后 shell 开始拆分为一个数组(并可能做其他扩展/munging/等)。 -
感谢您的帮助!已经解决了
标签: bash apache shell centos sudoers