利用php利用root权限执行shell脚本必须进行以下几个步骤
这几天弄的东西涉及到php利用shell脚本与Linux的交互,我们知道利用php运行脚本来访问Linux是以Apach的身份来执行的,因此它自己能够所做的事情很少的,因为没有足够的权限,这里就涉及到要将为php执行的时候赋予root权限。
接下来介绍的这种方法,我自己是亲自做了的,可以实现,但是毕竟有它的缺点,这里跟大家分享一下,希望大家有什么好的做法可以提示一下:
这是利用C来实现互换权限的,如果你想彻底明白到底为什么接下来的程序可以运行成功,请彻底弄清楚SUID与SGID到底起什么作用。
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <unistd.h>
- 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 <sys/types.h>
#include <unistd.h>
函数原型: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 "<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/目录下:
哈哈。。。大功告成!(谢谢存哥的帮助指点!)
转载于:https://www.cnblogs.com/awinlei/archive/2013/04/02/2995367.html
利用php利用root权限执行shell脚本必须进行以下几个步骤相关推荐
- php怎么获取权限操作 shell,利用php利用root权限执行shell脚本必须进行以下几个步骤...
这几天弄的东西涉及到php利用shell脚本与Linux的交互,我们知道利用php运行脚本来访问Linux是以Apach的身份来执行的,因此它自己能够所做的事情很少的,因为没有足够的权限,这里就涉及到 ...
- php利用root权限执行shell脚本
今天晚上:19:30分,这个困扰了我好久的问题终于解决,其中的原理也终于弄清楚了,总之是利用sudo来赋予Apache的用户root的执行权限,下面记录一下: 利用php利用root权限执行shell ...
- Android7下app以root权限运行shell脚本的一种方法
如果我们想要以root权限运行一个shell脚本(如此以来可以做很多的事情,比如直接控制设备节点等操作),那我们可以按照如下方法来做 1)修改system/core/rootdir/init.rc,添 ...
- 以Android L读取系统所有logcat并写入文件为例分析Android 以添加系统进程的方式申请selinux的权限执行shell脚本,以及avc:dined应该怎么申请权限
添加selinux较好的文章,可以通过adb shell dmesg > kenel.log 获取kmesg 可以看到 avc:dined 相关内容 首先说说环境: 基于Android L的ao ...
- app以root身法执行shell脚本
2019独角兽企业重金招聘Python工程师标准>>> 写一个xxxsh的shell脚本文件,放到android系统的/system/bin目录下 #! /system/bin/sh ...
- linux无需管理员运行sh,linux下权限问题,如何让无root管理员权限的用户执行需root权限执行的脚本文件...
匿名用户 1级 2013-07-12 回答 看了前面几位回答者我觉得应当采取一种简单的方法. 看你的意图允许任何人挂载/dev/sda5并且访问它 那么可以如此,任何人都可以挂载硬盘而无需密码,包括其 ...
- linux 权限测试,linux下检测root权限的shell脚本
个人心血来潮时写的一个脚本,比较粗糙,功能也很简单,大家有兴趣的可以拿去改改. 本脚本之争对系统中UID为0的用户 #!/bin/bash #大家都知道 echo tes ...
- Linux 上如何让任意普通用户执行拥有root权限的特定脚本或者程序
问题描述: 有一个脚本,只能是具有root执行权限的用户来执行.这意味着只有root用户和拥有sudo权限的用户才能执行,但我们的需求是让普通用户在没有取得root权限的情况下也能执行,那么就开发另一 ...
- Linux终端执行shell脚本,提示没有权限
Linux终端执行shell脚本 问题:提示没有权限 执行命令:./test.sh,提示没有权限. 解决方案: 提示:修改脚本文件test.sh的权限 执行命令:chmod 777 ./test.sh ...
- linux执行shell过程日志,Android之在linux终端执行shell脚本直接打印当前运行app的日志...
1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...
最新文章
- Qt 使用#define+qDebug()输出调试信息
- libreadline.so.6: undefined symbol
- Netty源码分析第6章(解码器)----第4节: 分隔符解码器
- 剪映导出帧率选多少_剪映帧率怎么设置?剪映帧率设置方法
- spark的三种运行模式以及yarn-client和yarn-cluster在提交命令上的区别
- 计算机网络入门指南之计算机网络体系结构
- python试卷河南理工大学万方科技学院_河南理工大学万方科技学院
- 云+AI+5G时代,华为云已准备好多元化云服务架构
- Lesson Plan 教学计划 翻译
- STL常见算法transform以及二分查找,以及lambda表达式
- 那么问题来了,什么才是正确的?我们就是为问题而生的
- SQL SERVER2008查询分析器的基本使用
- python计算峰度和偏度、相关系数
- 利用Python scapy爬取起点小说网小说
- vs2013编译ffmpeg之三十一 vidstab
- 苹果手机自带表格软件_手机自带的软件无法卸载?教你一招”!
- IO流,小白入门基础知识
- c语言的内部名和外部名,C语言 external
- [ Linux ] 零散文件系统安装各种命令和软件的方法
- [Leetcode 每日精选](本周主题-股票) 714. 买卖股票的最佳时机含手续费
热门文章
- 西交大计算机系分数线,西安交通大学专业排名及分数线
- mysql创建多个联合索引吗_高性能索引油画策略(二):多个索引是独立建立索引还是建联合索引?...
- mac high sierra开机按option怎么只有一个磁盘_Mac降级重装必备 | MacOS 制作启动U盘及安装方法!...
- Debug JDK源码没变量值怎么办?
- 集结六大行业领袖,「数据科学家」新课全球首发!
- git 还原某个文件到特定版本
- NGUI组件参数总结
- 斯诺登:澳大利亚的监视政策比NSA还下流
- 如何在java对象里访问Spring中已加载的property内容
- 【原创】开车分四个阶段的话,你属于哪个