You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP无法执行Shell脚本:Apache下shell_exec调用sudo权限问题

解决Apache下PHP执行sudo脚本无密码验证问题

1. 修正sudoers配置

  • 不要授权/bin/sh,直接授权目标脚本的绝对路径,避免权限过大且解决路径匹配问题。在/etc/sudoers.d/下创建文件(比如www-data-sudo),写入:
    www-data ALL=(ALL) NOPASSWD:/绝对路径/connect.sh
    
  • 用visudo -cf /etc/sudoers.d/www-data-sudo验证配置语法,确保无错误
  • 确保sudoers配置文件权限为0440,否则会被sudo忽略:chmod 0440 /etc/sudoers.d/www-data-sudo

2. 调整PHP执行命令

  • 使用脚本绝对路径,避免相对路径导致的解析问题,同时直接执行脚本(前提脚本有执行权限):
    <?php
    $scriptAbsPath = '/var/www/your-project/connect.sh'; // 替换为实际绝对路径
    $output = shell_exec("sudo $scriptAbsPath 2>&1");
    print_r($output);
    ?>
    
  • 若脚本必须通过sh调用,需在sudoers里精确匹配命令:
    www-data ALL=(ALL) NOPASSWD:/bin/sh /绝对路径/connect.sh
    

3. 排查脚本内部的sudo依赖

  • 如果connect.sh内部还有sudo执行其他命令,这些命令也需要在sudoers中配置无密码授权,否则仍会触发密码提示。例如脚本里有sudo systemctl restart nginx,则需添加:
    www-data ALL=(ALL) NOPASSWD:/bin/systemctl restart nginx
    

4. 检查SELinux限制(针对RHEL/CentOS等发行版)

  • 临时关闭SELinux测试:setenforce 0,若问题解决,再配置持久化规则(以脚本需要网络连接为例):
    setsebool -P httpd_can_network_connect 1
    

5. 确保脚本权限正确

  • 给脚本添加执行权限:chmod +x /绝对路径/connect.sh
  • 确保www-data对脚本所在目录有读权限:chmod o+r /脚本所在目录

内容的提问来源于stack exchange,提问作者Evan Marsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:33:14