今天下午 Mito 在 QQ上问我如何用 PHP 执行系统指令,还要 root 权限,原来是他们老板要管理员通过 Web 修改系统时间日期……无语中,这个要求真 TMD 变态。
不过这个问题我也不会,测试一下重定向和管道技术把密码发给 su 指令,提示信息是:
su: must be run from a terminal
不过想想也是正常,安全问题嘛,小心为好。不过还是不死心,搜索了一下解决方法。
其中让 PHP 执行系统命令有以下几种方法:
- string system (string command [, int return_var]);
- string exec (string command [, string array [, int return_var]]);
(以上两个傻子都知道)
- void passthru (string command [, int return_var]);
这个有点新鲜,说明是:passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
实例:
<?php
header("Content-type: image/gif");
?>
- 用“`”符号,这个……估计呆子也能知道,居然那个网站还觉得是秘籍……汗ing
最重要的,也是解决 root 权限的方法,就是使用 popen() 函数打开进程。
原网站上说明如下:上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加 Linux 的系统用户时,要调用 su 来把当前用户换到 root 才行,而 su 命令必须要在命令行上输入 root 的密码。这种情况下,用上面提到的方法显然是不行的。popen() 函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在 PHP3 中,对这种句柄只能做单一的操作模式,要么写,要么读;从 PHP4 开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用 pclose() 函数来关闭它。
实例:
<?php
/ PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户, root密码是 verygood。仅供参考 /
$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add =
sprintf("%s "%s %s
"",
$sucommand,
$useradd,
$user);
$fp = @
popen($user_add,
"w");
@
fputs($fp,
$rootpasswd);
?>