如何在实时服务器上使用 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);
}
我还建议您使用完整路径而不是相对路径(如果您的用例可能的话),这样当您重新使用另一个文件中的代码时,就不会在另一个目录中执行操作。如果不确定,请通过正确验证确保您始终处于正确的路径中。
我有一个简单的脚本,可以为每个注册的用户创建文件夹,它在本地工作得很好,但是在推送到实时服务器后它不起作用...我发现它需要 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);
}
我还建议您使用完整路径而不是相对路径(如果您的用例可能的话),这样当您重新使用另一个文件中的代码时,就不会在另一个目录中执行操作。如果不确定,请通过正确验证确保您始终处于正确的路径中。