【问题标题】:how to run php exec with sudo on live server如何在实时服务器上使用 sudo 运行 php exec
【发布时间】:2020-02-24 13:07:13
【问题描述】:

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

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

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

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

echo exec($createDir);

我的问题是,我应该如何让 exec 以 root 身份运行?我在 digitalocean 中使用 centOS

【问题讨论】:

标签: php laravel centos digital-ocean


【解决方案1】:

我不建议以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

【讨论】:

  • usermod: 组 'www-data' 不存在(我使用的是 centos 而不是 ubuntu)
  • 我已经编辑了我的答案。 CentOS 有 apache 而不是 www-data。为混乱道歉。
【解决方案2】:

这不是对您问题的直接回答,只是对您的代码提出的改进建议。我不会使用 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);
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多