Centos PHP+Apache执行exec()等Linux脚本权限设置的详细步骤
1. 查看一下你的Apache的执行用户是谁: lsof -i:80 运行之后的结果为:
从图中我们可以清楚的看到,httpd(也就是Apache)的执行用户为:exec_shell(注:这是我本机上改过之后的用户,只是用来说明一下,你的肯定不是这个!)
lsof 就是 List of file 的缩写,就是列出当前系统打开文件的工具,关于他具体的使用方法可参考:http://club.topsage.com/thread-234763-1-1.html 说的比较不错
确定了你的Linux上Apache的执行者是谁,下面为了安全起见,新建一个用户将Apache的执行用户修改为我们新建的用户。
2. 新建Apache的执行用户
useradd your_exec_user 我们知道创建用户的时候都会默认创建一个用用户名同样的用户组,也就是说现在我们也有一个your_exec_user的用户组
下面我们修改一下Apache的配置文件,使它的执行用户改为我们刚才新建的这个用户your_exec_user :
vi /home/houqingdong/httpd-exe/config/httpd.conf(这个是你的Apache所在的目录位置)
找到下面的地方,修改为你新建的用户:your_exec_user
重新启动Apache: /home/houqingdong/httpd-exe/bin/apachect1 restart -------------> 重启完之后你可以利用:lsof -i:80 查看一下。
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/目录下:
大功告成!
相关文章
- linux-AWK
- Linux/CentOS 搭建 SVN 项目
- Linux/CentOS 服务安装/卸载,开机启动chkconfig命令详解|如何让MySQL、Apache开机启动?
- CentOS Linux系统下更改Apache默认网站目录
- Linux ./configure --prefix命令
- EasyDSS流媒体服务器Linux emerg getpwnam("xxx") failed解决办法
- linux 中强大且常用命令:find、grep
- CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org
- Linux centos7安装nfs及服务端配置
- Linux 0.11-从一次定时器滴答来看进程调度-25
- Linux 0.11 - 管理内存前先划分出三个边界值-12
- 【项目实战】在基于Red Hat的Linux发行版(如CentOS)上中使用软件包管理器yum来安装、更新和删除软件包
- linux中IO函数(仅限于读写)的总结
- Linux安装centos,网络net8模式ping不通www.baidu.com或者ping不通主机
- L76.linux命令每日一练 -- 第11章 Linux系统管理命令 -- free和iftop
- L62.linux命令每日一练 -- 第九章 Linux进程管理命令 -- strace和ltrace
- L47.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- users和whoami
- L34.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- echo和watch
- 【Linux之Shell脚本实战】Centos最小化安装环境配置脚本
- Linux系统之MobaXterm远程连接centos的GNOME桌面环境
- Linux基础命令-setfacl设置文件ACL策略规则
- Linux 的文件权限和目录配置
- CentOS 6.3 源码安装LAMP(Linux+Apache+Mysql+Php)环境
- Linux基础知识点总结
- 很建议学习的Linux软件包管理— 软件包分类