繁体   English   中英

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

[英]how to run php exec with sudo on live server

我有一个简单的脚本,可以为每个注册的用户创建文件夹,它在本地运行良好,但在推送到实时服务器后它不起作用......我发现它需要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

我不建议将脚本作为sudo运行。 更好的替代方法是授予 Web 服务器( www-data用户)写入../../merchants目录的../../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

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

我建议您使用 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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM