1. 查看一下你的Apache的执行用户是谁: lsof -i:80 运行以后的结果为:php
从图中咱们能够清楚的看到,httpd(也就是Apache)的执行用户为:exec_shell(注:这是我本机上改过以后的用户,只是用来讲明一下,你的确定不是这个!) html
lsof 就是 List of file 的缩写,就是列出当前系统打开文件的工具,关于他具体的使用方法可参考:http://club.topsage.com/thread-234763-1-1.html 说的比较不错shell
肯定了你的Linux上Apache的执行者是谁,下面为了安全起见,新建一个用户将Apache的执行用户修改成咱们新建的用户。apache
2. 新建Apache的执行用户安全
useradd your_exec_user 咱们知道建立用户的时候都会默认建立一个用用户名一样的用户组,也就是说如今咱们也有一个your_exec_user的用户组bash
下面咱们修改一下Apache的配置文件,使它的执行用户改成咱们刚才新建的这个用户your_exec_user :函数
vi /home/houqingdong/httpd-exe/config/httpd.conf(这个是你的Apache所在的目录位置)工具
找到下面的地方,修改成你新建的用户:your_exec_userui
从新启动Apache: /home/houqingdong/httpd-exe/bin/apachect1 restart -------------> 重启完以后你能够利用:lsof -i:80 查看一下。spa
3. 执行visudo(或者是 vi /etc/sudoers) , 为your_exec_user赋予root权限,而且不须要密码,还有一步重要的修改(我被困扰的就是这个地方)
visudo 找到这个地方,添加your_exec_user,而且设置无需密码
我以前的时候,作完这里就去执行php脚本去了,结果一直建立不成功,并且很郁闷的是我切换到your_exec_user用户下直接执行是能够执行成功的。
后来,查看了一下Apache的日志文件,发现:
这里明显看出,在执行sudo的时候说必需要有一个tty去运行sudo , 知道问题出在哪里问题就好解决了: vi /etc/sudoers 将下面的这句注释掉:
这是由于默认的状况下,执行sudo须要一个终端,这里注释掉就能够了。接下来,写你的shell脚本和php命令吧
4. 这里贴一下我写的很简单的一个脚本,就是利用在php端传来的$directory和$name,在该目录下建立一个$name的目录
#!/bin/bash
#Program
# This program will execute mkdir: cd $directory ; mkdir $name
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
cd $1
if [ ! -d $2 ]; then
mkdir $2
else
echo "Already exist..."
exit 1
fi
功能很简单,就是进入到$directory 判断要建立的目录名是否存在, 而后建立该目录 。
构造的php执行函数:(部分)
if($type=="dir"){
$make_dir_command="/usr/bin/sudo /home/houqingdong/myshell/mkdir.sh /$directory/ $name" ;
echo $make_dir_command;
exec($make_dir_command,$output,$return);
if($return == 0){
echo "<script>alert('Build directory seccuss!');location.href='right.php?id=\"$directory\"';</script>";
}else{
echo "<script>alert('Build directory err!');history.go(-1);</script>";
}
这里顺带提一句:构造的命令里面最好都使用绝对路径。
5. 在网页端的执行结果:
提交以后,要过几秒中才会弹出执行结果的提示信息:
执行成功,在咱们的/home/目录下:
大功告成!