Php 并非所有命令都与exec/shell\u exec一起使用

Php 并非所有命令都与exec/shell\u exec一起使用,php,Php,我有一个apache2服务器在Raspberry Pi 4上 所有php网页都位于/var/www/html中 在一个php文件中,我有以下工作shell\u exec: if(isset($_POST['restart_device'])) { shell_exec("sudo /var/www/html/restart_device.sh"); header("Location: /"); die(); } $make_exe

我有一个apache2服务器在Raspberry Pi 4上

所有php网页都位于
/var/www/html

在一个php文件中,我有以下工作
shell\u exec

if(isset($_POST['restart_device'])) {
    shell_exec("sudo /var/www/html/restart_device.sh");
    header("Location: /");
    die();
}
$make_exe = "sudo chmod +x $uploadFileDir"."$fileName";
shell_exec($make_exe);
在另一个php文件中,这个不起作用
shell\u exec

if(isset($_POST['restart_device'])) {
    shell_exec("sudo /var/www/html/restart_device.sh");
    header("Location: /");
    die();
}
$make_exe = "sudo chmod +x $uploadFileDir"."$fileName";
shell_exec($make_exe);
回显
$make_exe
返回
sudo chmod+x/var/www/html/uploads/MP_Display

我在
/etc/sudoers.tmp
中添加了
www-data-ALL=NOPASSWD:/var/www/html/
,使用
sudo-visudo

为什么一个工作而另一个不工作

我试过使用:

exec($make_exe, $full, $status);
if($status != 0) {
    echo "<br>Something went wrong<br>";
} else {
    echo "<br>$response<br>";
}
这将返回
数组(0){}
,但它不起作用

然后我尝试了一个shell脚本:

mv /var/www/html/uploads/MP_Display /var/www/html/4panel/
我从php运行的:

shell_exec("sudo /var/www/html/rmv_fl.sh")
我知道从php运行shell脚本可以工作
shell_exec(“sudo/var/www/html/restart_device.sh”)


为什么
mv
根本不起作用?

除了从安全角度看非常可怕之外,你发布的代码没有什么问题

要调试运行这些命令时出现的问题,请模拟web服务器用户(
www-data
)。这样,您就可以像运行PHP脚本一样运行所有这些命令,并查看它们可能导致的错误

为此,在Raspberry Pi中打开一个终端,然后运行
sudo su www-data-s/bin/bash
。后续命令将作为
www-data
运行(请在那里尝试
sudo/var/www/html/restart\u-device.sh
等)

注意,sudoers中的目录只允许执行该目录中的文件。来自man sudoers(我的重点):

目录是完全限定的路径名 以“/”结尾。当您在Cmnd_列表中指定目录时,用户将能够运行该目录中的任何文件(但不能) 在其中的任何子目录中)


要编辑sudoers文件,应使用
visudo
命令。编辑后,使用
visudo-c
对其进行验证。如果你在那里输入错误,那可能是灾难性的。@Daan我确实用
sudovisudo
编辑过它。另外,运行
sudovisudo-c
返回所有OK。定义“不工作”。这个命令的输出/返回值是多少?“sudo chmod”--您做了一些非常错误的事情。为什么您需要
sudo
来完成此任务?无论如何,基本想法是,当您使用
sudo
执行非管理任务时,您走错了路。这条路径会导致越来越多地使用
sudo
,直到您开始思考为什么不使用
root
帐户。这正是
sudo
命令试图避免的。它的目的是允许普通用户执行一些管理任务。重新启动服务就是这样一项任务,但chmod却不是。为什么
非常可怕?我如何才能做到不那么可怕呢?显然,您正在以root用户身份运行一个上传的脚本。该脚本上的任何内容都将被执行,包括对系统的任何修改、密码等。“安全”方式实际上取决于您试图作为一个整体归档的内容。但我不是以root用户身份运行php
ps aux | grep httpd
返回pi作为服务器的所有者。此外,
/var/www/html
中的所有php文件都归pi:pi所有。模拟www数据并执行
mv/var/www/html/uploads/Metrici\u MP\u Display/var/www/html/4panel/
工作。为什么不能从
exec
?尝试确定PHP脚本运行的用户
www data
是基于用户的猜测,如果使用不同的用户,则没有任何效果。