我想要完成的是让 php 页面执行 shell 命令并在网页上显示输出。
该页面的代码大致如下
<?php
echo shell_exec('ls -l /code');
?>
当我加载此页面时,我看到的都是空白。但是,当我从命令行执行它时,我可以看到正在执行的命令和打印的输出。
我确信这与权限有关,我希望有人能给我指明正确的方向。
这是我在 httpd 日志文件中看到的内容
ls: cannot access /gateway_code: Permission denied
ls: cannot access /gateway_code: Permission denied
顺便说一下,目录 /code 对于用户“apache”设置为“只读”
谢谢!-ankit
答案1
检查您的基本目录限制。Php 没有权限访问 /bin/ls。不要将 /bin 目录添加到基本目录限制列表,而是将 /bin/ls 复制到文件夹 /code。
如果你确实必须这么做。
答案2
顺便说一下,目录 /code 对于用户“apache”设置为“只读”
这是你对权限设置方式的解释——如果你能告诉我们权限实际上是什么,那会更有用是。
我怀疑该目录无法由 apache uid 执行。或者这里可能存在 MAC/ACL 问题 - 但您没有提供这是哪个 Linux 发行版的详细信息,也没有提供权限设置方式。
答案3
首先要让 PHP 给出更好的答案,而不是只给出一个空白页。您可以使用以下命令将 stderr 重定向到 stdout,2>&1
这样错误消息就会通过 echo 打印出来。
<?php
echo shell_exec('ls -l /code 2>&1');
?>
接下来,确保运行 php 脚本的任何进程(即 apache)对您要列出的目录具有执行权限。如果您不介意过于严厉,只需向所有人授予 rwx 访问权限,即可轻松确定权限是否是问题所在。
> chmod 777 code
最后,请确保您指定了正确的路径。您在问题中说您试图列出内容/code
——您真的想列出根级目录吗?如果code
文件夹与您的脚本位于同一目录中,那么使用相对路径可能会更好。
echo shell_exec('ls -l ./code 2>&1');