电话
400 9058 355
可行但风险极高,因disable_functions禁用、Web进程权限不足、SELinux/容器策略拦截;应优先使用PHP内置chmod()、chown()函数,并校验路径与权限值。
PHP 用 exec() 调用 chmod 或 chown 修改文件权限,可行但风险极高——默认被禁用、常被 SELinux/容器环境拦截、易引发权限越界或命令注入。
exec() 改权限经常失败不是代码写错了,而是底层限制太多:
disable_functions 配置里通常已禁用 exec、shell_exec、system 等函数(查 phpinfo() 的 disable_functions 行)chmod 会报 Operation not permitted
avc: denied { setattr })chown 基本无效;chmod 却可能因挂载选项(如 noexec、nosuid)失败exec("chmod 755 ...") 的安全写法要点如果硬要走系统命令,必须堵住命令注入和权限失控两个口子:
exec("chmod " . $_GET['mod'] . " " . $_GET['file'])
realpath($path) + str_starts_with($real, '/var/www/html/uploads/')

in_array($mode, ['644', '755', '600', '700']),别用八进制 0644 直接传参(exec 不解析 PHP 八进制语法)2>&1 捕获错误:exec("chmod {$mode} " . escapeshellarg($safe_path) . " 2>&1", $output, $return_code);检查 $return_code !== 0 再处理escapeshellarg() —— 它防的是空格、$、`、* 等 shell 元字符,不是 SQL 注入那套逻辑exec 更可靠的实际替代方案99% 的场景下,直接用 PHP 内置函数更稳:
chmod():它绕过 shell,不触发 disable_functions 限制,也不受 SELinux 的 exec 策略影响chmod('/path/to/file', 0644)(注意是八进制整数 0644,不是字符串 "644")chown() / chgrp():同样不走 shell,但要求 PHP 进程 UID/GID 有对应权限(比如要改成 www-data:www-data,当前进程就得是 root 或 www-data)move_uploaded_file() 移动完马上 chmod(),避免中间状态被访问scandir() + 循环 chmod(),别写 shell 脚本再 exec —— 多一层调用就多一层失败点真正麻烦的从来不是“怎么调 chmod”,而是“谁允许你改”——Web 进程 UID、目录 ACL、SELinux 上下文、容器安全策略,这些没理清,exec 写得再漂亮也卡在 permission denied。先 ps aux | grep apache 看进程用户,再 ls -ld /target/dir 看目录权限,最后 ausearch -m avc -ts recent 查 SELinux 拒绝记录,比反复试 exec 命令有用得多。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...