加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

php借助root权限执行shell脚本

发布时间:2021-12-13 11:21:00 所属栏目:教程 来源:互联网
导读:这几天弄的东西涉及到php利用shell脚本与Linux的交互,我们知道利用php运行脚本来访问Linux是以Apach的身份来执行的,因此它自己能够所做的事情很少的,因为没有足够的权限,这里就涉及到要将为php执行的时候赋予root权限。 接下来介绍的这种方法,我自己是

这几天弄的东西涉及到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:%un",getuid());
//  printf("my euid:%un",geteuid());
    if(setreuid(euid,uid))
      perror("setreuid");
//  printf("after setreuid uid:%un",getuid());
//  printf("after setreuid euid:%un",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编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读