zoukankan      html  css  js  c++  java
  • 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的目录

       

    1. #!/bin/bash  

    2. #Program  

    3. #     This program will execute mkdir: cd $directory ; mkdir $name  

    4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  

    5. export PATH  

    6. cd $1  

    7. if [ ! -d $2 ]; then  

    8.     mkdir $2  

    9. else  

    10.     echo "Already exist..."  

    11.     exit 1  

    12. fi  


    功能很简单,就是进入到$directory   判断要创建的目录名是否存在,  然后创建该目录 。

    构造的php执行函数:(部分)

    1. if($type=="dir"){  

    2.           $make_dir_command="/usr/bin/sudo /home/houqingdong/myshell/mkdir.sh /$directory/ $name" ;  

    3.           echo $make_dir_command;  

    4.           exec($make_dir_command,$output,$return);  

    5.   

    6.               if($return == 0){  

    7.                   echo "<script>alert('Build directory seccuss!');location.href='right.php?id="$directory"';</script>";  

    8.               }else{  

    9.                   echo "<script>alert('Build directory err!');history.go(-1);</script>";  

    10.               }  

    这里顺带提一句:构造的命令里面最好都使用绝对路径。

    5. 在网页端的执行结果:

        

    提交之后,要过几秒中才会弹出执行结果的提示信息:

         执行成功,在我们的/home/目录下:

    大功告成!

  • 相关阅读:
    The parent project must have a packaging type of POM
    oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)
    此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决办法方案
    @Modules( ... ) 多个包路径问题
    phpstorm常用操作---1、phpstorm安装插件
    phpstorm中如何配置phpunit(单元测试)
    前端性能优化---3、静态资源使用cdn加速
    前端性能优化---2、图片响应式加载
    前端性能优化---1、懒加载和复杂资源点击时再请求
    Javascript进阶课程---1、使用工厂模式创建对象
  • 原文地址:https://www.cnblogs.com/diligenceday/p/10344901.html
Copyright © 2011-2022 走看看