[英]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.