PHP shell_exec执行命令时无法读取目标目录权限问题求助
SELinux 强制访问控制限制
Oracle Linux 8默认启用SELinux,即便文件权限配置正确,SELinux的上下文规则仍可能阻止apache用户访问根目录下的自定义目录。- 临时关闭SELinux测试:
setenforce 0,之后尝试读取目录,若恢复正常则说明是SELinux导致的问题。 - 永久修复:设置正确的文件上下文
semanage fcontext -a -t httpd_sys_content_t "/targetdir(/.*)?" restorecon -Rv /targetdir
- 临时关闭SELinux测试:
PHP-FPM chroot 配置限制
检查PHP-FPM的池配置文件(通常位于/etc/php-fpm.d/www.conf),查看是否设置了chroot指令。如果开启chroot,PHP进程的根目录会被切换到指定路径,真实系统的/targetdir在PHP执行环境中无法直接访问。找到该配置项并注释,重启php-fpm服务:systemctl restart php-fpm。PHP open_basedir 限制
检查php.ini或PHP-FPM池配置中的open_basedir参数,若该参数指定了允许访问的目录白名单,且未包含/targetdir或/,会限制PHP进程(包括其启动的子进程)访问该目录。修改配置将/targetdir添加到白名单,重启php-fpm服务生效。根分区挂载参数限制
执行mount | grep /查看根分区的挂载参数,若存在noexec、nodev等特殊参数,可能间接影响目录访问(虽然读权限理论上不受noexec影响,但部分环境下会出现异常)。若确有此类参数,可修改/etc/fstab调整挂载选项后重新挂载。命令执行路径问题
确认shell_exec执行的读取命令是否使用了绝对路径,比如是否是ls /targetdir而非ls targetdir。如果PHP进程的当前工作目录不是系统根目录,相对路径会导致找不到目标目录。
内容的提问来源于stack exchange,提问作者fah81

