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

时间:2018-01-18 23:10:12

标签: php linux command-line shell-exec

我跟随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)

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

1 个答案:

答案 0 :(得分:2)

根据它的外观,你的PATH变量只包含/bin。这只允许您在该目录中运行可执行文件。有几种方法可以解决这个问题。

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

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

# /etc/apache2/envvars
...

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

方法2:为用户配置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 config

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

一旦找到了您正在运行的用户,您就需要为该用户设置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之外的二进制文件,但它很快一个可行的解决方案。

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