PHP shell_exec() 不起作用,但命令可以从控制台运行

mch*_*eah 5 php linux command-line shell-exec

我正在按照本指南通过 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)

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

Ste*_*Hat 6

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

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

如果您正在运行 apache,则只需编辑即可/etc/apache2/envvars包含 PATH 变量定义。编辑文件并在底部添加新行(如果尚不存在):

# /etc/apache2/envvars
...

export PATH="/bin:/usr/local/bin"
Run Code Online (Sandbox Code Playgroud)

方法二:为用户配置PATH

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

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

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

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

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

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

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

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

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

<?php

putenv('PATH=/bin:/usr/local/bin');
...
Run Code Online (Sandbox Code Playgroud)

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

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

更重要的是,您正在编写不可移植的并且依赖于特定系统的代码。这是不好的编码实践,不推荐/不赞成。