PHP 脚本无法运行 bash 脚本。sh:权限被拒绝

PHP 脚本无法运行 bash 脚本。sh:权限被拒绝

我正在尝试从 PHP 执行 .sh 脚本,但是它没有执行。

我检查了错误日志,并收到“sh:权限被拒绝”错误。我检查了 php 在哪个用户下运行,它是在 apache 用户下运行的。

我尝试将 .sh 的所有权更改为 apache 用户,但没有结果。

我起初以为这是因为脚本位于 www/ 目录之外,但是即使我将脚本放在同一目录中,仍然会出现错误。

除了将 apache 用户添加到 SUDOers 列表之外,还有其他解决方案吗?

如果我使用“php filename.php”命令从 putty 启动 sh 脚本,该脚本运行良好。

答案1

请尝试以下建议:

  • 尝试运行以下测试命令,并检查它是否有效:
    • php -r "echo exec('whoami');"
  • 确保所有父目录和文件至少具有r-x标志权限:
    • chmod 755 dir; chmod 755 file
  • 确保文件的所有者是您的Apache 用户
    • 尝试+s向文件添加标志(sudo)(不推荐):
      • chmod u+s file
  • 确保您的 PHP 没有运行在safe_mode
  • 确保脚本位于 Apache 根目录中:
    • 否则,将脚本移到里面,
    • 或者将该目录添加到你的 Apache 配置中,
    • 或者将此目录添加到您的include_path,例如:
      • php.ini文件:include_path ".:/usr/local/lib/php:/your/dir"
      • 或者.htaccess文件:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • /bin/sh检查您的 shell 是否对您的 Apache 用户设置为有效(例如)(例如使用以下方式检查finger):
  • 确保你php.ini不使用:disable_functionsforexec函数
  • 如果使用 SELinux 或已selinux-utils安装(安全增强型 Linux 系统),请按照以下说明进行检查getenforce/配置setenforce@托宁回答。

故障排除:

  • 如果你修改了php.inihttpd.conf文件,请不要忘记重新启动 Web 服务器,
  • 检查 Apache 错误日志以获取更多详细信息。
  • php.ini在所有类型的错误中启用( display_errorerror_reporting等等)。

答案2

此类问题可能取决于您使用的操作系统及其配置方式。一些 Linux 发行版(主要是基于 RHEL 的发行版,如 CentOS 或 Fedora)默认启用了 SELinux。可以使用以下命令检查并临时更改此设置:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

您还可以使用以下方式更全面地了解当前配置:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

/etc/selinux/config通过编辑文件并将SELINUX变量设置为permissive或可以使此更改永久生效disabled

但,解决此类问题的正确方法如果您确实处于这种情况,则检查/var/log/audit/audit.log日志文件。它将包含与 SELinux 规则相关的所有事件。然后,您可能应该为您的脚本提供正确的上下文,即被授权由 apache/php 用户运行。检查 SELinux 安全上下文的方法如下ls -Z

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

这列出了每个文件/目录的用户、角色和类型。这里的类型httpd_sys_script_exec_t赋予 cgi 目录中的文件由 httpd 执行的权限。您的 shell 脚本可能应该具有相同的类型。

您也可以将audit.log行输入到audit2allow命令中。它将输出使 SELinux 正常运行所需的更改。但通常建议的更改需要在 SELinux 策略本身上进行,而这不是您应该做的事情(不过,此输出可以提供一些线索,说明发生了什么)。

以下页面描述了类似的问题以及不同的解决方法:http://sheltren.com/stop-disabling-selinux

答案3

所以我在 Google 上搜索了类似的问题后找到了这里。我想说的是,关于 SELinux 的评论为我指明了正确的方向。

就我自己而言,我使用的是使用 shell 命令的自定义 Git 部署脚本。该命令在 BASH 上运行良好,但在 Git 上却出现“权限被拒绝”和“不是存储库”的情况。这真的很奇怪,我进行了多次修复,直到我偶然发现了这个答案。

root@ls:~# /usr/sbin/setenforce Permissive为我解决了这个问题。

答案4

通过 Apache 在 PHP 中运行 root 命令

我有一个 Web 应用程序需要在 PHP 函数中以 root 身份执行 shell 命令,您可能会认为这很简单……但我花了几次谷歌搜索才获得所有详细信息,因此这里是我对此的简要说明。这是在运行 Apache 的 Linux 系统上,我们将在“shell_exec”中使用“sudo”来运行命令。

主要的事情是编辑 /etc/sudoers 文件,通常您可以(以 root 身份)使用“visudo”命令来执行此操作。

确保 apache 可以运行命令,并且不需要密码:

apache  ALL=(ALL)       NOPASSWD: ALL

然后需要注释掉这一行:

#Defaults    requiretty

如果不这样做,那么您将在 /var/log/secure 中看到这些错误:“抱歉,您必须有一个 tty 才能运行 sudo”。现在您已准备就绪,PHP 代码很简单:

$results = shell_exec('sudo 日期');

相关内容