我遵循本指南通过Git部署我的网站,并且在PHP ()或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)
)
这些对项目的工作并不重要,但我仍然想知道是否存在某种权限问题或我做错了什么事情。这里有人有洞察力吗?
发布于 2018-01-18 16:58:55
从外观上看,您的路径变量只包括/bin
。这只允许您在该目录中运行可执行文件。有几种方法可以解决这个问题。
方法1:配置web服务器环境变量
如果您正在运行apache,您可以简单地编辑/etc/apache2/envvars
以包含路径变量定义。编辑文件并向底部添加一个新行(如果它还不存在):
# /etc/apache2/envvars
...
export PATH="/bin:/usr/local/bin"
方法2:为用户配置路径
或者,如果您作为服务用户以外的用户运行web服务器,则该用户可能无法正确配置其路径。这就像为用户更改环境变量一样简单,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/etc/nginx/nginx.conf
- nginx配置(还有许多其他可能的配置,但这些配置是最常见的)
一旦您发现您正在以哪个用户的身份运行,您就需要为该用户设置路径变量。这可能就像导出其主bash配置中的路径一样简单。例如,这可能是/home/bob/.bashrc
。但是,没有家的服务用户会有所不同。
方法3:在脚本中声明路径
您可以在PHP脚本中手动指定路径变量。这可以通过在脚本中添加以下行来实现:
<?php
putenv('PATH=/bin:/usr/local/bin');
...
您需要更改路径以满足您的需要,并且需要在调用shell_exec()
之前对其进行声明。
这个方法不是首选的,因为您需要为每个使用shell_exec()
调用/bin
之外的二进制文件的PHP脚本指定这个方法,但这是一个快速的、有效的解决方案。
更重要的是,您正在编写不可移植的、依赖于特定系统的代码。这是糟糕的编码实践,不建议/不反对。
https://stackoverflow.com/questions/48331794
复制相似问题