我正在尝试从 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_functions
forexec
函数 - 如果使用 SELinux 或已
selinux-utils
安装(安全增强型 Linux 系统),请按照以下说明进行检查getenforce
/配置setenforce
@托宁回答。
故障排除:
- 如果你修改了
php.ini
或httpd.conf
文件,请不要忘记重新启动 Web 服务器, - 检查 Apache 错误日志以获取更多详细信息。
php.ini
在所有类型的错误中启用(display_error
、error_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 日期');