PHP shell_exec() 不工作,但命令从控制台工作

标签 php linux command-line shell-exec

我正在关注 this guide通过 Git 部署我的网站,我遇到了 PHP shell_exec() 或 exec() 的一些问题。 部署脚本运行多个命令,例如 gitwhoamiwhich gitrsync 等。所有这些当我以服务器用户身份登录时,命令有效。

但是,当我点击应该运行这些命令的 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/

相关文章:

ruby-on-rails - 在 linux 上部署后推送通知时出错

c - dup() 后跟来自多个线程或进程的 close()

无法使用 perl 中的系统命令获取已编译 C 程序执行的标准错误

c - 将 sprintf 中的信息保存到变量

php - 耗时的 PHP 脚本以及解决问题的方法?

php - 将表单输入附加到 Formdata 对象不起作用

php - 如何从远程服务器收集 HTML 源响应?

php - 查询生成器原始横向连接与 jsonb_to_recordset

command-line - TFS 命令行 checkin

command-line - 从命令行获取一组数字的平均值的最快方法是什么?