【问题标题】:PHP shell_exec() doesn't work but commands work from consolePHP shell_exec() 不起作用,但命令从控制台工作
【发布时间】:2018-06-28 03:29:17
【问题描述】:

我正在关注 this guide 通过 Git 部署我的网站,但我在 PHP shell_exec() 或 exec() 方面遇到了一些问题。 部署脚本运行多个命令,例如gitwhoamiwhich gitrsync 等。当我以服务器用户身份登录时,所有这些命令都有效。

但是,当我点击应该运行这些命令的 php 脚本时,它们不起作用。 whoami: command not found

git: command not found

rsync: command not found

which: command not found

我可以通过提供命令的路径来解决这个问题(例如/usr/bin/whoami => myuser),但是像/usr/bin/which rsync 这样的一些命令仍然不起作用。 (那个给我/usr/bin/which: no rsync in (/bin)

这些对于使项目正常运行并不重要,但我仍然想知道是否存在某种权限问题或我做错了什么。有人对此有任何见解吗?

【问题讨论】:

  • 好像执行命令的环境的PATH变量仅限于/bin目录
  • 这是 apache/PHP 的问题吗?或者我该如何解决?
  • 这些路径是在系统级别还是用户级别定义的...您正在测试它的执行用户...它与在 apache 上执行的用户是否不同?

标签: php linux command-line shell-exec


【解决方案1】:

从外观上看,您的 PATH 变量仅包含 /bin。这仅允许您在该目录中运行可执行文件。有几种方法可以解决此问题。

方法一:配置web服务器环境变量

如果您正在运行 apache,您可以简单地编辑 /etc/apache2/envvars 以包含 PATH 变量定义。编辑文件并在底部添加一个新行(如果它不存在):

# /etc/apache2/envvars
...

export PATH="/bin:/usr/local/bin"

方法二:为用户配置PATH

或者,如果您以服务用户以外的用户身份运行 Web 服务器,则该用户可能没有正确配置其 PATH。这就像为用户更改环境变量一样简单,Web 服务器将继承它(除非在 Web 服务器的配置中另有定义)。

第一步是确定您的 Web 服务器以哪个用户身份运行。如果您不知道,您可以查看正在运行的进程列表来查找用户。这可以通过运行以下命令来完成:

ps aux|grep {webserver}|grep -v grep 其中{webserver} 替换为您当前正在运行的Web 服务器。 (apache/httpd, nginx)

或者,您可以签入以下配置文件:

  • /etc/httpd/conf/httpd.conf - CentOS Apache
  • /etc/apache2/apache2.conf - Ubuntu/Debian Apache
  • /etc/nginx/nginx.conf - nginx 配置

(还有许多其他可能的配置,但这些是最常见的)

一旦您确定了您以哪个用户身份运行,您就需要为该用户设置 PATH 变量。这可能就像在他们的家庭 bash 配置中导出 PATH 一样简单。例如,这可能是/home/bob/.bashrc。然而,没有家的服务用户会有所不同。

方法 3:在 PHP 脚本中声明 PATH

您可以在 PHP 脚本中手动指定 PATH 变量。这可以通过在脚本中添加以下行来完成:

<?php

putenv('PATH=/bin:/usr/local/bin');
...

您需要更改 PATH 以满足您的需要,并且需要在调用 shell_exec() 之前声明它。

此方法不是首选方法,因为您需要为您执行的每个 PHP 脚本指定此方法,该脚本使用 shell_exec() 调用 /bin 之外的二进制文件,但它是一种快速的一次性解决方案,可以使用.

更重要的是,您正在编写不可移植且依赖于特定系统的代码。这是一种糟糕的编码习惯,不推荐/不赞成。

【讨论】:

  • 谢谢!我更改了 $PATH 变量,但我认为它与以“nobody”用户身份运行的服务器有关。不幸的是,唯一有效的解决方案是您的第三个解决方案,但如果我能弄清楚如何安全地以“myuser”身份运行,而不是“nobody”,我相信这个问题会自行解决。
  • 在这种情况下尝试探索方法 2,在其中一个配置文件中,您可以选择更改运行 apache 的用户。任何东西都比方法 3 好。
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多