用于做为解决php以root管理权限实行一些用户不可以实行的指令或运用的参照。
实际上php里的popen()涵数是能够解决这个问题的,可是因为一些版本的Linux(如我应用的Centos 5)对系统优化的考虑到,
促使这个问题解决起來麻烦了许多。先看来一个网民应用popen()涵数的事例。
复制代码 代码以下:
/* PHP中怎样提升一个系统软件客户
下边是一段方法,提升一个姓名为james的客户,
root密码是 louis。仅作参考
*/
$sucommand = "su root --command";
$useradd = "/scripts/demo/runscripts.php";
$rootpasswd = "louis";
$user = "james";
$user_add = sprintf("%s %s",$sucommand,$useradd);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);

历经自身的检测,确认此段代码是不可以完成(最少在我的系统里是那样的)创作者要想得到的結果的。历经自身很长期的google以后,
难题的关键是su root这一指令必须的登陆密码务必以终端设备的方式键入,不可以根据其他的方式(我不知道还有没有其他的方式)得到。
又因为新项目规定不可以应用类似sudo这类运用,无可奈何下,我选择了网民明确提出的用撰写C程序流程的方式来解决此难题。
最先写个C程序流程,取名为:run.c 放到文件目录/scripts/demo/下
复制代码 代码以下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
//char cmd[1024]; //自变量临时未应用
uid = getuid() ;
euid = geteuid();
printf("my uid :%u\n",getuid()); //这儿显示信息的是当今的uid 能够注解掉.
printf("my euid :%u\n",geteuid()); //这儿显示信息的是当今的euid
if(setreuid(euid, uid)) //互换这两个id
perror("setreuid");
printf("after setreuid uid :%u\n",getuid());
printf("afer sertreuid euid :%u\n",geteuid());
system("/scripts/demo/runscripts.php"); //实行脚本制作
return 0;
}

编译程序该文件:
gcc -o run -Wall run.c
在该途径下转化成run文档,这一exe文件。假如如今用PHP脚本制作启用 该run得话,即便 setreuid了 也是不好的。
接下去要做的是:给run授予suid管理权限
# chmod u s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
好啦,早已设定到了,再写一个php网页页面启用它。
复制代码 代码以下:
<?php
echo '<pre>';
$last_line = system('/scripts/demo/run', $retval);
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

电脑浏览器中访问 。
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48

--------------------------------------------------------------------------------
Last line of the output: afer sertreuid euid :48
--------------------------------------------------------------------------------
Return value: 0
该指令实行取得成功。
从显示信息結果能够看得出: apache(daemon)的uid 为48(实际上许多 linux系统软件下daemon的uid为2)。
启用setreuid后将合理客户id和具体客户id交换了。(务必在chmod u s起效的状况下) 使apache当今的uid为0那样就能实行root指令了。
只必须变更 C文档中的system所需实行的指令就可以完成自身的PHP以root人物角色运行命令了。

在玩C 之前 玩过一段时间的PHP, 哪一个情况下必须用PHP 来运作root指令,一直未果,直至有一天检索来到super这一软件.
伴随着玩C的生活多了.发觉可以用C语言来包囊 要运作的外部命令. 试验了一下.成功了.
不用一切外界专用工具就可以完成用PHP 实行root指令.
我下面就把方式公布给大伙儿,有要求用php来运作root指令的盆友能够无需犯愁了.
服务平台:Linux. 试验指令iptables 当今的文件目录是/var/www/html/http
写程序的情况下 用root客户
大家都了解iptables 非root客户不可以运作.
最先写个C程序流程
取名为:ipt.c
复制代码 代码以下:
#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()); //这儿显示信息的是当今的uid 能够注解掉.
printf("my euid :%u\n",geteuid()); //这儿显示信息的是当今的euid
if(setreuid(euid, uid)) //互换这两个id
perror("setreuid");
printf("after setreuid uid :%u\n",getuid());
printf("afer sertreuid euid :%u\n",geteuid());
system("/sbin/iptables -L"); //实行iptables -L指令
return 0;
}


编译程序该文件 gcc -o ipt -Wall ipt.c
在该途径下转化成ipt 这一exe文件.
假如如今用PHP网页页面启用 该ipt得话,即便 setreuid了 也是不好的.
接下去要做的是chmod u s ./ipt
ls 一下
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s位早已设定到了.
再写一个php网页页面启用它.
复制代码 代码以下:
<?php
echo '<pre>';
$last_line = system('/var/www/html/http/ipt', $retval);
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

在电脑浏览器中访问 .

[color=Red]Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination [/color]
[color=Blue]my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48[/color]

--------------------------------------------------------------------------------
Last line of the output: afer sertreuid euid :48
--------------------------------------------------------------------------------
Return value: 0

该指令实行取得成功..
大家都知道: apache的uid 为48. 启用setreuid后 将合理客户id 和具体客户id交换了.(务必在chmod u s起效的状况下) 使apache当今的 uid为0 那样就能实行root指令了。

大伙儿只必须变更 C文档中的 system所需实行的指令就可以完成自身的PHP实行root指令了.