对于apache,由于其执行权限一般为apache:apache,用户和组都是apache, apache用户的特点是无密码,不能登录,无环境变量等。
这些特点决定了在cgi中只能借用sudo来实现”允许在cgi中调用system执行命令”的特性。查遍了n篇文章,得到如下总结:
1. 为sudoer文件开启w权限
chmod u+w /etc/sudoers
2. 执行visudo命令, 给apache用户分配sudo权限
visudo
a. 注释掉1行:
#Defaults requiretty
b. 增加2行:
Defaults visiblepw
apache ALL=(ALL) NOPASSWD:/usr/bin/sudo, /usr/local/bin/MP4Box, /usr/local/bin/ffmpeg
#我这里允许在cgi中调用 /usr/bin/sudo, /usr/local/bin/MP4Box, /usr/local/bin/ffmpeg三个命令,您可以根据需要修改
#注意上面这2行的作用至关重要,不可随意修改其格式
c. 保存退出visudo,退出跟vi命令一样
:wq
3. 关闭sudoer文件w权限
chmod -w /etc/sudoers
4. 在cgi中调用代码如下,注意对输出信息重定向到/dev/null,否则apache会报错误:500 Internal Server Error
在解决该问题的过程中,查看/var/log/httpd/ 下的apache的错误日志,常见错误日志如下:(方便后来者利用google搜索)
apache的相关错误信息
sorry, you must have a tty to run sudo
sudo: no tty present and no askpass program specified
auth could not identify password for [apache]
[sudo] password for apache
sudo: 3 incorrect password attempts