如何在sudoers中正确配置sudo -u指定用户的免密执行规则
解决方法
核心原因是sudoers规则默认仅允许以root身份执行配置的命令,你调用时指定了-u www-data切换到自身用户执行,规则没有匹配该场景导致报错。
步骤1:修改sudoers配置
执行sudo visudo命令编辑配置文件,添加如下规则:
www-data ALL=(www-data) NOPASSWD: /usr/bin/python3 /var/www/html/script.py
规则说明:
- 括号中的
(www-data)显式声明了允许调用sudo的用户可以切换到www-data身份执行后续命令,匹配你代码中sudo -u www-data的参数要求 - 命令段仅需填写实际要执行的程序完整路径和参数,不需要添加
sudo前缀或-u参数,否则会触发visudo语法校验错误
步骤2:验证配置有效性
可以先手动切换到www-data用户测试命令是否能正常执行,避免修改代码后反复排查:
# 切换到www-data用户 sudo su -s /bin/bash www-data # 测试sudo命令是否能无密码执行 sudo -u www-data /usr/bin/python3 /var/www/html/script.py
如果没有弹出密码输入提示、脚本正常运行,说明配置生效。
可选优化方案
如果你的python脚本不需要额外的系统特权,由于PHP本身就以www-data身份运行,你可以直接去掉sudo调用,PHP代码改为:
<?php $command = '/usr/bin/python3 /var/www/html/script.py'; shell_exec($command); ?>
这种方案不需要配置sudo规则,运行效率更高且安全风险更低。
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

