为什么 shell 命令从命令行运行而不是从 php 脚本运行?

为什么 shell 命令从命令行运行而不是从 php 脚本运行?

我正在编写一个脚本,使用 s3cmd amazon s3 命​​令行实用程序备份一些文件。

当我从 shell 运行 s3cmd shell 命令时,它会很好地备份文件。当我从 PHP 脚本运行相同的命令(使用反引号或 shell_exec)时,它不会执行任何操作,也不会向 PHP 脚本返回任何输出。

其他 shell 命令(例如 mysqldump 和 tar)以类似的方式(反引号)成功运行。在脚本和 shell 中使用 whoami 我发现 shell 用户是 root 而 PHP 脚本用户是“apache”。

我怎样才能使 PHP 脚本成功运行该命令?(我知道该命令应该可以工作,因为将其按原样复制到 shell 中确实可以工作)。

答案1

在这种情况下,s3cmd 的问题不是 s3cmd 文件,而是默认为的配置文件~/.s3cfg

以 root 身份运行的 CLI 脚本具有读取权限,但 apache Web 服务器却没有。

您需要做的就是将配置文件复制到另一个位置并将其设置为 chown,以便 apache 用户可以访问它,然后在s3cmd 的shell_exec使用选项中。-c FILE

此外,您需要将 env var 设置HOME为空字符串,因为 s3cmd 脚本使其优先于-c. 所以您的shell_exec内容看起来像这样:shell_exec('export HOME="";s3cmd -c ....');

答案2

以下几个问题或许能帮助你找到问题的根源:

  • 您是否对尝试写入的目录拥有适当的权限?
  • 该命令是否可以以普通用户身份运行(我不知道 s3,抱歉)
  • 您看过日志了吗?

答案3

一般来说,此类问题通常是由于环境不同造成的。例如,$PATH 可能不同,您不应依赖它来为您查找程序,而应确保将其设置为包含必要的目录或在命令中包含完整路径名。

答案4

如果您从 PHP 脚本运行它,您是指从命令行运行 PHP 脚本还是指通过 Web 服务器由某些东西触发?

如果您尝试从 Web 界面触发它,很有可能出于安全原因它尝试以没有实际权限的nobody组中的用户身份运行。nobody

您应该能够将用户上下文作为脚本的一部分进行测试,但您可以更改各种内容来真正解决问题 - 其中一些可能取决于您的环境和/或技术水平。可能性包括 setuid 位、suexec、更改 Apache 上下文等。

相关内容