【问题标题】:Executing a linux command with php exec() and running a shell script使用 php exec() 执行 linux 命令并运行 shell 脚本
【发布时间】:2011-12-02 09:31:42
【问题描述】:

我正在尝试在我的服务器上运行这段 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 的站点。谢谢。

【问题讨论】:

  • exec 的调用是否产生任何错误/警告?
  • 这是不可取的,虚拟主机文件应该有访问限制,它不应该通过apache用户修改。
  • @JanHančič 不,我没有收到任何错误。
  • @ajreal 你建议我如何实施这个解决方案?
  • @Nithin 你的目标是什么?应用于虚拟主机配置的更改只会在 apache 上重新启动后生效。虽然在 apache (php) 上运行的脚本不应该对 apache 服务有更高的控制权。

标签: php linux


【解决方案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() 只返回命令输出的最后一行,虽然这些只显示一行)。这些命令将告诉您运行代码的用户以及他们是否可以看到该文件。

【讨论】:

  • 这是我运行您提供的代码 sn-p 时得到的。 uid=33(www-data) gid=33(www-data) groups=33(www-data) -rw-r--r-- 1 ubuntu ubuntu 10 Dec 2 09:02 /home/ubuntu/scripts/test_file php 文件是 /var/www/websites/jivity/testing.php 。你能告诉我我在这里做错了什么吗?谢谢。 PS:用户对 /home/ubuntu 目录有完全权限,但对运行 php 脚本的目录没有权限。
  • 好吧,根据这个输出,只有ubuntu 用户可以写入test_file,但是您的php 代码以www-data 用户身份运行。尝试为文件及其路径上的所有目录授予适当的权限。关于“适当”的注意事项:您可以使用www-data 组而不是授予整个世界的权限。代码运行的目录无关紧要。另外,尝试将文件写入/tmp 以验证您是否可以实际写入文件。
【解决方案2】:

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

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

【讨论】:

  • 如何让 php 写入文件,然后运行一个 cron,该 cron 又运行一个写入 Apache 配置的 shell 脚本?
  • 是的,这是一个合适的选择。
最近更新 更多