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

时间:2011-12-02 09:31:42

标签: php linux

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

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

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

另外,我正在尝试通过php脚本在服务器上创建虚拟主机文件。不是通过php exec()运行命令,我认为运行shell脚本会更好,shell脚本从文本文件中读取所需参数并在虚拟主机文件中设置目录路径。我是linux的新手,这是一个很好的方法还是有更好的方法来解决这个问题?所有这一切都是为了以编程方式设置基于magento的站点。感谢。

2 个答案:

答案 0 :(得分:1)

您的代码没问题。问题可能在于你的php在safe mode(虽然它已被弃用,请参阅链接)或文件/目录权限。

无需提供文件权限0777,因为这使文件可执行,0666就足够了。但是,对于文件来说,拥有正确的权限是不够的,路径上的每个目录都必须是可遍历的。尝试运行php代码的用户可以访问的其他目录,/tmp是一个好的开始。

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

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

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

答案 1 :(得分:0)

正如评论已经说过的那样:这实际上是完成你要做的事情的不好方法,因为通过网络编写基于用户输入的Apache配置可能会让你遇到多个问题。

您可能会考虑的是让PHP端将所需信息写入文件或数据库,然后通过cron脚本或类似方法轮询所有文件或数据库以执行实际配置更改。这消除了对PHP的exec()的需要(这总是很糟糕)。有了这个,运行PHP的进程就不需要对重要的系统文件具有写权限。