如何在实时服务器上使用 sudo 运行 php exec

how to run php exec with sudo on live server

我有一个简单的脚本,可以为每个注册的用户创建文件夹,它在本地工作得很好,但是在推送到实时服务器后它不起作用...我发现它需要 sudo 密码.我 google 周围所有人都建议我应该通过 运行ning visudo 编辑 sudoer 但没有任何效果。

 $sudoPassword = \Config::get('app.sudoPassword');

 $sudo = "echo $sudoPassword | sudo -S ";

 $createDir =  "cd ../../merchants && mkdir ".$merchant->identity." && cd ".$merchant->identity;

echo exec($createDir);

我的问题是,我应该如何以 root 身份执行 运行?我在 digitalocean

中使用 centOS

我不推荐 运行 作为 sudo 的脚本。更好的选择是允许 Web 服务器(www-data 用户)写入 ../../merchants 目录。

首先通过运行下面的命令将自己添加到www-data组。

usermod -a -G www-data <your-username>

然后使用以下命令将 merchants 文件夹的所有权授予 www-data 组。

chgrp www-data merchants

最后使用以下命令为 merchants 文件夹赋予正确的权限。

chmod g+rwxs merchants

希望这能帮助您解决问题。


编辑

在 CentOS 上,您应该使用 apache 而不是 www-data

这不是对您问题的直接回答,只是对您的代码提出的改进建议。我不会使用 sudo,而是坚持使用@tamrat 的解决方案。这更像是评论,但太长了,无法作为评论。

我建议您使用 Symfony 的流程组件,而不是使用 php 的 exec 函数,它已经在您的 Laravel 项目中可用。

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

使用:

$createDir =  "mkdir /full/path/to/merchants/".$merchant->identity." && cd /full/path/to/merchants/".$merchant->identity;

$process = new Process($createDir);
$process->run();

if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

我还建议您使用完整路径而不是相对路径(如果您的用例可能的话),这样当您重新使用另一个文件中的代码时,就不会在另一个目录中执行操作。如果不确定,请通过正确验证确保您始终处于正确的路径中。