【问题标题】:Php exec() command not working on localhostphp exec() 命令在本地主机上不起作用
【发布时间】:2018-10-08 12:02:40
【问题描述】:

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

我已经检查了以下答案:
1:sudo in php exec()
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() 使用任何命令,例如再次编译文件会显示相同的错误。

【问题讨论】:

  • 我认为你不应该在 exec() 函数中使用 sudo。只需确保该目录属于 php 使用的同一用户。并确保它有被编辑的权利。
  • 我认为您应该使用 fopen() 而不是 exec() 创建文件。再次,目录的权利应该是正确的。 chmod 并将 linux 中的目录 chown 给正确的用户。
  • @Rolfie 使用exec('fopen("a.cpp", "w")') or die("Unable to create file!"); 也不起作用,文件有权编辑,但有办法检查和更改吗?
  • fopen() 是一个 php 函数,而不是一个 linux 函数。所以不需要exec。只需 fopen("a.cpp", "w");检查php.net/manual/en/function.fopen.php
  • touch() 也是一个 php 函数,请查看 php.net/manual/en/function.touch.php 。这也应该做你想做的事。 fopen 主要用于当您想在文件中写入内容时使用,例如 txt 文件。所以maby touch() 对你来说是更好的选择。

标签: php


【解决方案1】:

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

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

开始吧

在网络根路径之外创建一个“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 运行命令的安全风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多