让apache可以执行sudo命令

没想到今天又解决了一个纠结了我好几天的小问题,这是今天第二篇日志了吧?真是高产啊,哈哈╮(╯▽╰)╭
回归正题:
skidu最近在做一个小东西,希望能通过php执行某些必须使用root账户才能执行的命令
此时我直接想到的就是sudo命令,可问题紧接着就来了,用户执行sudo的时候是需要输入用户密码的呀,apache作为一名资深nologin用户,肿么可能这么玩啊 :way:
输入visudo过后仔细看了一会文档,发现里面有一个NOPASSWD的设置方法,果断测试之~!

比如咱想用php直接为linux添加一个用户,要使用到useradd命令,键入which useradd可以查看到该命令位于/usr/sbin/useradd,修改配置文件:

visudo
apache localhost=NOPASSWD:/usr/sbin/useradd

然后编辑一个test.php页面

shell_exec("/usr/sudo /usr/sbin/useradd testuser");

执行过后发现用户并没有被添加进去 :wha:
好吧,咱使用一个可以输出结果的sbin命令来试试
为了方便测试,这里直接给apache允许使用sudo执行所有命令

visudo
apache localhost=NOPASSWD:ALL
$output = shell_exec("/usr/sudo /sbin/ifconfig");
var_dump($output);

发现已经没能正常输出文档,难道是跟php的安全模式有关系?
紧接着就是抓狂时间,打开/关闭php安全模式、设置safe_mode_exec_dir……
各种方法skidu都一一测试,发现返回结果不是false就是NULL,度娘也不好使,查出来的都是一些乱七八糟的玩意 :yaaa:
紧接着的几天时间skidu又进入了项目期,于是这个问题被暂时搁浅了- -

嗯,今天,由于昨天熬夜做了监控,今天就开始偷懒了,于是skidu又想起了这个问题,果断上Google查了一番,终于还是在一个老外那里找到了答案,据说是跟/etc/sudoer(其实visudo命令就是编辑的这个文件)这个文件的权限有关
解决步骤:

1、为sudoer文件开启w权限
chmod u+w /etc/sudoer
2、给apache用户分配sudo权限
apache localhost=NOPASSWD:/sbin/ifconfig
3、关闭sudoer文件w权限
chmod -w /etc/sudoer

至此权限设置完毕,再次执行php脚本

/**
 *test.php
 */
shell_exec("/usr/sudo /usr/sbin/useradd testuser");

刷新页面过后查看passwd文件

more /etc/passwd

在最后一行看见了什么?

testuser:x:502:502::/home/testuser:/bin/bash

啊哈哈,这坑爹的玩意今天终于解决掉了 :woo:

标签: apache sudo, php sudo, sudo, sudoer, visudo

已有 2 条评论

  1. 3q

    感謝您~~~偶也搞定了

  2. 話說乃想要用php操作系統么,不過這樣的話安全性要注重的說

评论已关闭