使用php exec()执行linux命令并运行shell脚本


Executing a linux command with php exec() and running a shell script

我想在我的服务器上运行这段PHP代码:

<?php
$cmd = 'echo "this is a test" > /home/ubuntu/scripts/test_file';
echo exec($cmd);
?>

根据我的理解,它应该将这段文本添加到文件test_file中。该文件存在于适当的位置,我已经尝试了chmod 755和chmod 777上的php文件。但我没有看到文本被添加到text_file。我试着在服务器上直接运行linux命令,它工作了。谁能告诉我我哪里做错了?

另外,我试图通过php脚本在服务器上创建一个虚拟主机文件。而不是通过php exec()运行命令,我认为最好运行一个shell脚本,shell脚本从文本文件中读取所需的参数,并在虚拟主机文件中设置目录路径。我是linux的新手,这是一个好方法还是有更好的方法去做这件事?所有这些都是为了以编程方式建立一个基于magento的网站。谢谢。

您的代码没问题。问题可能在于您的php处于安全模式(尽管已弃用,请参阅链接)或文件/目录权限。

不需要给文件权限0777,因为这使文件可执行,0666应该足够了。但是,仅使文件具有正确的权限是不够的,路径上的每个目录必须是可遍历的。尝试一个不同的目录,php代码运行的用户可以访问该目录,/tmp是一个很好的开始。

调试此类问题的一般方法是执行一个不同的命令,该命令可以提供有关echo执行的上下文的额外信息,例如

<?php
echo exec("id");
echo "<br/>";
echo exec("ls -l /home/ubuntu/scripts/test_file");
?>

(记住exec()只返回命令输出的最后一行,但这些只显示一行)。这些命令将告诉您运行代码的用户,以及他们是否可以看到文件。

正如评论已经说过的:这实际上是一种糟糕的方式来完成你想做的事情,因为通过web编写基于用户输入的Apache配置可能会给你带来多种问题。

您可能考虑的是让PHP端将所需的信息写入文件或数据库,然后通过cron脚本或类似的由执行实际配置更改的不同进程每隔一段时间进行轮询。这消除了从PHP执行exec()的需要(这总是不好的)。这样,运行PHP的进程就不需要对重要的系统文件有写权限了。