我正在关注 this guide通过 Git 部署我的网站,我遇到了 PHP shell_exec() 或 exec() 的一些问题。
部署脚本运行多个命令,例如 git
、whoami
、which git
、rsync
等。所有这些当我以服务器用户身份登录时,命令有效。
但是,当我点击应该运行这些命令的 php 脚本时,它们不起作用。
whoami:找不到命令
git:找不到命令
rsync:找不到命令
哪个:找不到命令
我可以通过提供命令路径(例如 /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"
方法二:为用户配置PATH
或者,如果您以服务用户以外的用户身份运行 Web 服务器,则该用户可能未正确配置其 PATH。这就像为用户更改环境变量一样简单,Web 服务器将继承它(除非在 Web 服务器的配置中另有定义)。
第一步是确定您的网络服务器以哪个用户身份运行。如果您不知道,您可以检查正在运行的进程列表以查找用户。这可以通过运行以下命令来完成:
ps aux|grep {网络服务器}|grep -v grep
其中 {webserver}
替换为您当前运行的 Web 服务器。 (apache/httpd, nginx)
或者,您可以 checkin 以下配置文件:
/etc/httpd/conf/httpd.conf
- CentOS Apache/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');
...
您需要更改 PATH 以满足您的需要,并且需要在调用 shell_exec()
之前声明它。
这种方法不是首选,因为您需要为您执行的每个使用 shell_exec()
调用 /bin
之外的二进制文件的 PHP 脚本指定此方法>,但这是一种快速的一次性解决方案。
更重要的是,您正在编写不可移植且依赖于特定系统的代码。这是糟糕的编码习惯,不推荐/反对。
关于PHP shell_exec() 不工作,但命令从控制台工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48331794/