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

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

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

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

我怎样才能使PHP脚本成功运行命令? (我知道该命令应该工作,因为它复制到shell是行不通的)。

在这种情况下s3cmd的问题不是s3cmd文件,而是默认为〜/ .s3cfg的configuration文件以root用户身份运行的CLI脚本具有对其的访问权限,但是apache Web服务器却没有。 所有你需要做的就是将configuration文件复制到另一个位置,并将其命名为apache用户可以访问它,然后在shell_exec中使用s3cmd的-c FILE选项。 此外,您需要将env var HOME设置为空string,因为s3cmd脚本使其优先于-c。 所以你的shell_exec将如下所示:shell_exec('export HOME =“”; s3cmd -c ….');

有几个问题可以帮助你find问题的来源:

  • 你有没有在你试图写的目录上有适当的权利?
  • 是可以作为简单用户运行的命令(我不知道s3,对不起)
  • 你有没有看日志?

一般来说,这样的问题往往是由于环境的差异造成的。 例如$ PATH可能会有所不同,而不是依靠它为您find一个程序,您应该确保将其设置为包含必要的目录或在命令中包含完整的path名。

查看phpinfo()的输出以查看这些函数调用是否在disable_functions中列出,从而阻止它们被执行。

如果你是从PHP脚本运行这个程序,你的意思是从命令行运行一个PHP脚本,还是说你的意思是通过web服务器被某些东西触发?

如果您试图从Web界面触发它,那么很有可能是因为没有真正的权限出于安全原因而没有任何nobody用户。

您应该能够将用户上下文作为脚本的一部分进行testing,但是您可以更改各种事项来实际解决问题 – 其中一些可能取决于您的环境和/或技术级别。 可能性包括setuid位,suexec,更改Apache上下文等