mch*_*eah 5 php linux command-line shell-exec
我正在按照本指南通过 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))
这些对于让项目正常运行并不重要,但我仍然想知道是否存在某种权限问题或我做错了什么。有人对这里有任何见解吗?
从表面上看,您的 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,但它是一种快速且可行的一次性解决方案。
更重要的是,您正在编写不可移植的并且依赖于特定系统的代码。这是不好的编码实践,不推荐/不赞成。
| 归档时间: |
|
| 查看次数: |
5783 次 |
| 最近记录: |