我跟随this guide通过Git部署我的网站,我遇到了PHP shell_exec()或exec()的一些问题。
部署脚本运行多个命令,例如git
,whoami
,which git
,rsync
等。当我以服务器身份登录时,所有这些命令都有效用户。
然而,当我点击应该运行这些命令的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)
)
这些对于让项目正常运行并不重要,但我仍然想知道是否存在某种权限问题或者我做错了什么。有没有人在这里有任何见解?
答案 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
之外的二进制文件,但它很快一个可行的解决方案。
更重要的是,您编写的代码不可移植且依赖于特定系统。这是糟糕的编码习惯,不建议/不赞成。