apache/Nginx下的PHP/Ruby执行sudo权限的系统命令

apache/Nginx下的PHP/Ruby可以直接Windows和Linux下的系统命令,在Linux下,一般只能执行普通用户对应的权限,如果要执行一下需要Sudo的命令,则需要进行一些配置。

修改方式是将Webserver运行的用户名,加上sudo权限,这样php或者Ruby(以下就只写php了)就可以调用sudo及对应的命令了。

一般来说,为了安全,需要指定这些用户可以执行哪些命令,方法是修改sudoers这个文件的配置。

首先编辑 /etc/sudoers 使用 visudo来编辑
/etc/sudoers的权限是440:

-r–r—– 1 root root 3248 Oct 18 23:47 /etc/sudoers

需要

chmod u+w /etc/sudoers

修改完毕之后再

chmod -w /etc/sudoers

因为如果/etc/sudoers的权限不是440,那么sudo会报错:

[root@hn ~]# sudo
sudo: /etc/sudoers is mode 0640, should be 0440
sudo: no valid sudoers sources found, quitting

在最下面添加一行

nobody ALL=NOPASSWD:/usr/local/squid/sbin/squid -k reconfigure

然后注释掉文件中的Defaults requiretty这行
否则会出现sudo: sorry, you must have a tty to run sudo的错误
保存退出即可

这里的nobody为WebServer运行的用户名,如httpd默认为apache,Nginx默认为nobody;
ALL=NOPASSWD为执行sudo时不需要输入密码,即在非交互界面中直接执行命令;
/usr/local/squid/sbin/squid -k reconfigure则是将可以执行的完整命令。

操作完以后可以进行测试,写一个php文件,内容如下

<?php
$output = shell_exec("/usr/bin/sudo /usr/local/squid/sbin/squid -k reconfigure");
echo $output;
?>

原文出自:http://tunps.com/php-sudo-root-privilege-program

发表评论

电子邮件地址不会被公开。