linux中php使用root权限执行shell脚本

今天晚上:19:30分,这个困扰了我好久的问题终于解决,其中的原理也终于弄清楚了,总之是利用sudo来赋予Apache的用户root的执行权限,下面记录一下:

利用php利用root权限执行shell脚本必须进行以下几个步骤:(所有步骤都是我亲自实验,若有不妥可指出,谢谢!)

1. 确定一下你的Apache的执行用户是谁。注:不一定就是nobody,我自行安装的httpd,我的Apache的用户就是daemon

2. 利用visudo为你的Apache执行用户赋予root执行权限,当然还有设置无密码。注:为了安全起见,这里最好是新建一个用户,让他作为Apache的执行用户即可(修改httpd.conf文件,后面我会指出)

3. 这步就简单了,编写你的脚本,利用php的exec,system...函数来执行。

接下来就是详细的实现过程:

1. 查看一下你的Apache的执行用户是谁: lsof -i:80         运行之后的结果为:

  

从图中我们可以清楚的看到,httpd(也就是Apache)的执行用户为:exec_shell(注:这是我本机上改过之后的用户,只是用来说明一下,你的肯定不是这个!)  

确定了你的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/目录下:

哈哈。。。大功告成!(谢谢存哥的帮助指点!)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索权限
, 密码
, 文件
, apache
, 注释
用户
shell脚本执行权限、shell脚本 root权限、用root权限执行sh脚本、java执行shell脚本、shell定时执行脚本,以便于您获取更多的相关知识。

时间: 2024-07-30 07:06:36

linux中php使用root权限执行shell脚本的相关文章

linux中vim保存root权限的文件

Linux中经常会遇到用vim编辑好了文件,保存的时候提示当前文件是只读的. E45: 'readonly' option is set (add ! to override) 原因也很简单,因为用户对当前编辑的文件没有写入权限,一个可行的解决办法就是重新使用sudo命令打开这个文件重新进行编辑,但是这样做的话,之前的编辑工作就需要全部重来了,怎么样才能在忘记使用sudo vim编辑自己不可写的文件后,仍然可以正常写入文件呢? vim的强大之处就体现出来了,下面的指令轻松搞定 :w !sudo

linux下php以root权限执行命令

最近由于要做一个php的接口,但是因为权限问题,不能执行一些特定命令,原因是php以nobody来运行. 网上搜索了些解决方案,一种是使用su的方法,一种是以c程序来实现,还有一种是用super程序实现. 比较了下,觉得super命令php调用起来更为方便一些,因此本篇主要介绍super的简单实现方法. 一.首先下载安装super,过程如下: [root@ossec.cn ~]#wget ftp://ftp.ucolick.org/pub/users/will/super-3.30.0-tar.

linux中mysql备份所有数据库的Shell脚本

所有数据库到一个文件:  代码如下 复制代码 #!/bin/bash   DATE=$(date +'%Y%m%d') TO_DIR="/home/wyl/文档/日报/230_database" DATE_DIR=${TO_DIR}"/"${DATE}   HOSTNAME='192.168.1.230' USERNAME='root' PASSWORD='tianji'   if [ ! -d "$DATE_DIR" ]; then      

linux普通用户获得root密码执行root权限的进程

问题描述 linux普通用户获得root密码执行root权限的进程 我想写一个程序,仿照在非root用户下安装程序时,提示需要root密码,然后就能继续安装.意思就是获得root密码后,我就能执行root权限的进程.这个该什么思路呢?execve函数的第三个参数设置环境变量能不能实现? 解决方案 普通用户执行ROOT权限 解决方案二: 用程序的话就有点麻烦了,可以使用Linux脚本,很方便,SHell脚本 解决方案三: python供你参考: #!/usr/bin/env python3 -*-

Linux中执行shell脚本的4种方法总结_linux shell

bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在

Linux中crontab任务计划不执行的问题分析

crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务. 使用权限: root用户和crontab文件的所有者 语法: crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 说明: cro

让PHP以ROOT权限执行系统命令的方法

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考. 其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑, 使得这个问题解决起来麻烦了好多.先来看一个网友使用popen()函数的例子. 复制代码 代码如下: /* PHP中如何增加一个系统用户 下面是一段例程,增加一个名字为james的用户, root密码是 louis.仅供参考 */ $sucommand = "su root --comman

让PHP以ROOT权限执行系统命令的方法_php技巧

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考. 其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑, 使得这个问题解决起来麻烦了好多.先来看一个网友使用popen()函数的例子. 复制代码 代码如下: /* PHP中如何增加一个系统用户 下面是一段例程,增加一个名字为james的用户, root密码是 louis.仅供参考 */ $sucommand = "su root --comman

java-android中怎么请求root权限

问题描述 android中怎么请求root权限 android中怎么请求root权限并且执行事件..执行的事件应该写在哪里?求代码..谢谢 解决方案 已解决..一直不知道执行的事件写在哪里..才知道获取的root权限是给你操纵一个目录的权限 解决方案二: 转自:http://orgcent.com/android-chmod-root-permission/ Android手机进行root之后,才可以请求root权限.?root是系统中唯一的超级用户,具有系统中所有的权限. 以下是实现代码: *