这几天弄的东西涉及到php利用shell脚本与Linux的交互,我们知道利用php运行脚本来访问Linux是以Apach的身份来执行的,因此它自己能够所做的事情很少的,因为没有足够的权限,这里就涉及到要将为php执行的时候赋予root权限。

接下来介绍的这种方法,我自己是亲自做了的,可以实现,但是毕竟有它的缺点,这里跟大家分享一下,希望大家有什么好的做法可以提示一下:

这是利用C来实现互换权限的,如果你想彻底明白到底为什么接下来的程序可以运行成功,请彻底弄清楚SUID与SGID到底起什么作用。

#include

#include

#include

#include

int main()

{

uid_t uid , euid ;

uid = getuid();

euid= geteuid();

//  printf("my uid:%u\n",getuid());

//  printf("my euid:%u\n",geteuid());

if(setreuid(euid,uid))

perror("setreuid");

//  printf("after setreuid uid:%u\n",getuid());

//  printf("after setreuid euid:%u\n",geteuid());

system("/home/houqingdong/myshell/mkdir.sh /home/ hou_test");

return 0;

}

其中的主要函数说明:

1.getuid()所需要的头文件为:

#include

#include

函数原型:uid_t getuid(void);

函数说明:uid_t是定义在sys/types.h中的,其实就是unsigned int类型,函数返回一个调用程序的真

实用户的ID。

2. geteuid()

函数原型:uid_t geteuid(void);

函数说明:geteuid()用来取得执行目前进程有效的用户识别码。有效的用户识别码用来决定进程执行

的权限,借由此改变此值进程可以获得额外的权限。倘若执行文件的setID位已被设置,该文件执行时,

其进程的euid值便会设成该文件的所有者的uid。例如,执行文件/usr/bin/myshell.sh的权限为:-r-s-

-x--x,其s位即为setID(SUID)位,而当任何用户在执行myshell.sh时其有效的用户识别码会被设成为

myshell.sh所有者的uid,即root的uid值为0.

3. setreuid();  可以理解为交换ID

编译该文件:     gcc -o run -Wall run.c    生成可执行文件run

接下来做的是最重要的一步,为run赋予suid的权限:chmod u+s run   它的作用是设置uid,当普通用户执行的时候是以root的权限来执行的,在run.c里面会交换进程的ID,从而利用root的ID为0,来执行,权限就可想而知了。

但是利用这个方法有一个很不好的地方,在run.c中,我执行的命令是:system("/home/houqingdong/myshell/mkdir.sh /home/ hou_test");   mkdir.sh是我自己写的脚本,而后面的两个参数是写死的,也就是说参数的传递非常不方便,当然如果你执行一些不需要传递参数的程序,这个方法还是很可行的,而我想做的是用户选择Linux下的某个目录,可以在这里面创建文件file或者目录directory,此时的参数就非常不好办了。

关于这个问题还尝试了另一种方法:

就是直接将自己写的shell脚本,执行:  chmod 777 mkdir.sh                chmod u+s mkdir.sh

这样我调用mkdir.sh的时候同样是以root的身份来执行的,但是我在网页端运行的时候,仍然报错,初步认定为我要创建文件的那个目录下Apache的权限不够,我尝试着将权限改为: chmod -R 777 /home/     然后在运行就可以创建成功了,但是这样为Apache添加权限的方法是很不正规的吧,我知道如何为Apache添加主目录和虚拟目录的权限

但是这样的就不知道了,总不能都改权限吧。

我知道我以上的方法肯定有很多地方存在不足的,无论是从可行性,还是从安全性,所以如果您恰好看到这篇文章,恰好知道更好的做法,愿您能够花费一点时间为我提示一下,不胜感激,谢谢!!

利用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(注:这是我本机上改过之后的用户,只是用来说明一下,你的肯定不是这个!)

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 "";

}else{

echo "";

}

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

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

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

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

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

php怎么获取权限操作 shell,利用php利用root权限执行shell脚本必须进行以下几个步骤...相关推荐

  1. root权限破解有什么用,root权限破解有什么用处

    手机root后有没有什么利弊? 一.手机root后的优势: 1.修改系统字体: 2.卸载系统自带程序(如相机.通讯录等): 3.修改系统的内部程序(玩游戏作弊,改钱,等级等): 4.系统美化(修改百分 ...

  2. linux中root权限如何开启,手机如何开启root权限?,看完你就知道了

    root权限,系统权限的一种,也叫根权限,与SYSTEM权限可以理解成一个概念,但高于Administrator权限,root是Linux和unix系统中的超级管理员用户帐户,该帐户拥有整个系统至高无 ...

  3. root权限后推荐的APP,root权限有什么用

    root之后,一定要安装什么强大的软件 root之后需要装几个最基本的软件. 1.权限管理.root后就获取了最高权限,为防止意外破坏和病毒入侵,一定要安装一个权限管理软件.一般常用的是supersu ...

  4. ipad有root权限吗,平板电脑可以root权限

    苹果iPad的root在哪? 在苹果了没有root这个说法,这个说法只是安卓系统上才有的,苹果的说法应该是越狱!苹果系统越狱就是苹果系统类似安卓root差不多,你想了解这个可以去网上搜苹果系统怎么越狱 ...

  5. 如何删除linux的root权限,永久删除现代Linux的root权限

    启动后,我希望我的 Linux程序删除root权限并切换到非特权帐户.我已经在网上找到了各种例子,但是对于我的要求没有任何规定,具体来说是: >这是一个永久的下降 >(e)uid和(e)g ...

  6. android程序root权限,android应用程序中应用root权限

    android应用程序中使用root权限 要在android应用程序中使用root权限,那么运行程序的设备必须具有root权限. http://www.eoeandroid.com/code/2012 ...

  7. android app 获得root 权限管理,获得Android App的“root”权限

    首先:请注意,您只能使用su执行shell命令(=您只能以root身份使用shell命令,而不能使用java代码). 第二:不确定这是否适用于所有su应用程序,但这是我手机上su的帮助信息: Usag ...

  8. android手机解除root,安卓手机root权限如何彻底清除 安卓手机root权限彻底清除要怎么做_系统圣地...

    ROOT权限虽然好用,但是也有缺点,那就是root之后之后是不能保修的,但我们也有一些取巧的办法,去彻底删除root痕迹,今天小编就给大家带来了这方面的教程,希望能对大家有所帮助. 1.备份授权管理程 ...

  9. android 小米申请root权限,小米稳定版如何获得root权限 小米稳定版获得root权限方法...

    8.修改完毕后,大家记得保存奥,或者直接退出,电脑提示是否保存,点击保存即可.保存完毕后,解压出来的压缩包要重新压缩回去,然后要签名,才能正常刷.因为,你解压缩后,压缩包的md5发生变化,签名就错误了 ...

  10. shell判断是否为root权限(id -u != 0)

    if [ "$(id -u)" != "0" ]; thenecho "This script must be run as root" 1 ...

最新文章

  1. MySQL 数据库常用命令—insert delete update select
  2. linux怎么开ssh端口,如何查看linux中的ssh端口开启状态
  3. node --- 模块化连接MongoDB数据库的参数设置方案之一
  4. java long double精度丢失_long long类型转double类型部分精度丢失问题
  5. ECSHOP如何增加红包序列号字符
  6. 前端学习(1319):node.js异步编程
  7. 数据流图怎么画_概率图模型怎么画?5个步骤完成专业模型图
  8. html5的新标记,HTML5 新标记
  9. Windows 10如何消除文件夹右上角的“相对箭头”?
  10. .NET控件Designer架构设“.NET研究”计
  11. 按钮跳转到其他ui界面_《明日方舟》UI/UX设计复盘
  12. Mysql 索引(学习笔记十二)
  13. 新手上路:盘点「性能测试」必须弄懂的技术点
  14. 中国第二代支付清算体系
  15. 创业维艰-公司业务解决方案推荐!
  16. Brute Force(暴力破解)
  17. Android Studio打不开,出现start failed的报错
  18. 字符串分段组合python123_boost python分段fau
  19. excel几个表合成一张_如何将几个excel文件合并_多个excel表合并成一个的方法
  20. 基于AdaBoost的人脸检测

热门文章

  1. C#设计模式(13)——代理模式(Proxy Pattern)
  2. zw版【转发·台湾nvp系列Delphi例程】HALCON HistoToThresh1
  3. HBase之四--(1):Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询...
  4. Revit二次开发之“让对象处于被选择状态”
  5. Outlook 2003解除附件下载限制
  6. MySQL性能优化 分区
  7. 1)python,现在用过的,后面推出每日练习语法与深度挖掘应用
  8. 用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST
  9. [设计模式] javascript 之 建造者模式
  10. smarty一维数组的引用