PHP 脚本不能运行 bash 脚本。sh:权限被拒绝

Rob*_*sto 16 script bash permissions php

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

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

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

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

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

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

Læt*_*æti 14

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

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive
Run Code Online (Sandbox Code Playgroud)

您还可以通过以下方式更完整地查看当前配置:

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
Run Code Online (Sandbox Code Playgroud)

可以通过编辑/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 ..
Run Code Online (Sandbox Code Playgroud)

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

您还可以将audit.log行提供给audit2allow命令。它将向您输出使 SELinux 满意所需的更改。但通常建议的更改需要在 SELinux 策略本身上完成,这不是您应该在您的情况下执行的操作(不过,此输出可以提供有关正在发生的事情的一些线索)。

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


ken*_*orb 11

尝试以下建议:

  • 尝试运行下面的测试命令,并检查它是否有效:
    • 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"
  • 检查您的 shell 是否设置为/bin/sh对您的 Apache 用户有效(例如)(例如检查:)finger
  • 确保您php.ini不使用:disable_functions用于exec功能
  • 如果使用 SELinux 或已selinux-utils安装(安全性增强的 Linux 系统),请按照@Tonin回答中的说明检查getenforce/setenforce配置。

故障排除:

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