繁体   English   中英

Php exec() 命令在本地主机上不起作用

[英]Php exec() command not working on localhost

我正在尝试在用户提交表单时创建一个文件,使用
exec("sudo touch a.cpp") or die("Unable to create file)";
输出:无法创建文件

我检查了以下答案:
1: php exec() 中的sudo
2: https : //askubuntu.com/questions/139723/sudo-does-not-ask-for-password/139733#139733
3: https : //askubuntu.com/questions/810462/nopasswd-option-not-working-in-sudo?noredirect=1&lq=1
4:也试过exec("echo <password> | sudo -S touch a.cpp");

visudo添加www-data ALL=(ALL) NOPASSWD: /var/www/html/<project-folder>

似乎没有任何效果。

更新:正如@Rolfie 在评论中提到的,使用 fopen() 解决了这个问题,但我仍然无法使用exec()使用任何命令,例如再次编译文件显示相同的错误。

您不必以 root 身份运行! 我在下面的回答不要求您授予 www-data 的 root 权限。

这有效 - 我在 2021 年 8 月的 Ubuntu 20.04 LTS 服务器上进行了测试。

让我们开始

在 web 根路径之外创建一个“sudocmds.txt”和“results.txt”文本文件,即

如果您的 webroot 是 /var/www/html/ 然后将您的文本文件放在 /var/www/cmds/

将文件的权限设置为 www-data:

sudo chown www-data /var/www/cmds/sudocmds.txt
sudo chown www-data /var/www/cmds/results.txt

我将使用 iptables 作为示例,通过按下按钮来显示“iptables -L”:

创建表格:

<form method="post">
<input type="hidden" name="cmd"> <br>
<input type="submit" name="cmd" value="CMD";">
</form>

当按下“CMD”按钮时,使用 PHP 代码将“1”写入 sudocmds.txt 文件:

<?php 
  if(isset($_POST['cmd']))
      {
       $data=$_POST['cmd'];
       file_put_contents("../cmds/sudocmds.txt", "1");
       sleep(1);
       echo nl2br( file_get_contents('../cmds/results.txt') );
      }
?>

现在创建一个在您的主机上运行的服务,该服务将监视文件并查找出现的 1,然后执行命令。

为此,我将使用 inotify-tools 作为示例:

sudo apt install inotify-tools -y

创建脚本:

sudo nano /opt/cmd-watcher.sh

#!/bin/bash

inotifywait -mqr -e close_write "/var/www/cmds/sudocmds.txt" | while read line
do
if grep -q 1 "/var/www/cmds/sudocmds.txt"; then
  sudo iptables -L > /var/www/cmds/results.txt
fi
done

使脚本可执行

sudo chmod +x /opt/cmd-watcher.sh

在后台运行脚本

sudo sh /opt/cmd-watcher.sh &

现在去你的网页刷新它并按下按钮,你会看到命令的结果在 1 秒后出现 :)

我知道这是一个过程,但这意味着您不必承担以 root 身份使用 www-data 运行命令的安全风险。

暂无
暂无

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

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