【问题标题】:Not all commands work with exec/shell_exec并非所有命令都适用于 exec/shell_exec
【发布时间】:2019-10-02 10:23:31
【问题描述】:

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

所有的php网页都在/var/www/html

我在一个 php 文件中有以下 工作 shell_exec

if(isset($_POST['restart_device'])) {
    shell_exec("sudo /var/www/html/restart_device.sh");
    header("Location: /");
    die();
}

这个不起作用 shell_exec 在另一个 php 文件中:

$make_exe = "sudo chmod +x $uploadFileDir"."$fileName";
shell_exec($make_exe);

回显$make_exe 返回sudo chmod +x /var/www/html/uploads/MP_Display

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

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

我尝试过使用:

exec($make_exe, $full, $status);
if($status != 0) {
    echo "<br>Something went wrong<br>";
} else {
    echo "<br>$response<br>";
}

它总是返回Something went wrong

编辑:

chmod 可以在没有sudo 的情况下工作。执行二进制文件无需sudo。但是移动文件根本不起作用!

我试过用 exec 运行命令:

$move_command = "sudo mv $uploadFileDir.$fileName /var/www/html/4panel/";
exec($move_command, $full_1, $status);
var_dump($full_1);
if($status !=0 ) { } else {}

这会返回array(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 根本不工作?

【问题讨论】:

  • 要编辑 sudoers 文件,您应该使用 visudo 命令。编辑后使用visudo -c 进行验证。如果你在那里打错字,那可能是灾难性的。
  • @Daan 我确实使用sudo visudo 对其进行了编辑。此外,运行 sudo visudo -c 会返回一切正常。
  • 定义“不工作”。命令的输出/返回值是多少?
  • "sudo chmod" - 你做错了什么。为什么需要sudo
  • 无论如何,基本思想是当您使用sudo 执行非管理员任务时,您走错了路。一条导致越来越多地使用sudo 的路径,直到您开始想知道为什么不使用root 帐户来代替。这正是sudo 命令试图避免的。其目的是允许普通用户执行一些 管理任务。重启服务是这样的任务,但chmod 不是。

标签: php


【解决方案1】:

除了从安全角度来看非常可怕之外,您发布的代码没有任何问题。

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

为此,请在您的 Raspberry Pi 中打开一个终端并运行 sudo su www-data -s /bin/bash。后续命令将以www-data 运行(试试sudo /var/www/html/restart_device.sh 等)

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

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

【讨论】:

  • 为什么是very scary?我怎样才能让它不那么可怕?
  • 显然,您正在以 root 身份运行上传的脚本。该脚本上的任何内容都将被执行,包括对系统、密码等的任何修改。“安全”方式实际上取决于您要归档的整体内容。
  • 但我没有以 root 身份运行 php。 ps aux | grep httpd 返回 pi 作为服务器的所有者。此外,/var/www/html 中的所有 php 文件都归 pi:pi 所有。
  • 冒充 www-data 并执行 mv /var/www/html/uploads/Metrici_MP_Display /var/www/html/4panel/ 工作。为什么不能从exec 完成?
  • 尝试确定您的 PHP 脚本与哪个用户一起运行。 www-data 是基于您的 sudoers 的猜测,如果您使用不同的用户,则不会有任何效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多