apache增加sudo权限,允许在cgi中调用system执行命令

对于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

    char szHintCmd[512];
    snprintf(szHintCmd, sizeof(szHintCmd) - 1, "/usr/bin/sudo /usr/local/bin/MP4Box -hint %s 1>/dev/null 2>/dev/null", sNewFile.c_str());
    int ret = system(szHintCmd);

在解决该问题的过程中,查看/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

回复

你的邮件地址不会被公开(Your email address will not be published.) Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>