一 用PHP提供的专门函数,简单执行命令
原型:
string system (string command [, int return_var]);
string exec(string command [, array $output [, int $return_var]]);
void passthru (string command [, int return_var]);
不同点:
system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
相同点:
都可以获得命令执行的状态码
前提条件:
由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
1) 执行外部命令
2) 在打开文件时有些限制
3) 连接MySQL数据库
4) 基于HTTP的认证
在 安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在php.ini文件中用 safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默认是 /usr/local/php/bin。
在/etc/php.ini文件中
把safe_mode_exec_dir=
改为
safe_mode_exec_dir = "/wwwroot/blog/protected/commands/shell"
二 用popen()函数打开进程,实现命令交互
如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。如下(root密码是root):
<?php $sucmd = "su --login root --command"; $useraddcmd = "useradd "; $rootpasswd = "root"; $user = "wzhwho"; $useraddcmd = sprintf("%s "%s %s"",$sucmd,$useraddcmd,$user); $fp = @popen($useraddcmd,"w"); @fputs($fp,$rootpasswd); @pclose($fp); ?>
三 示例
C程序
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int a = 0; int r =0; if(argc != 2) { printf("usage: %s &r\n", argv[0]); exit(-1); } a = atoi(argv[1]); r = a*a; printf("Ok:r = %d\n",r); return r; }
php程序
<html> <body> <h1>Call External Program</h1> <?php $p=3; $ret = -1; $r =-1; echo "=====system========"; echo "<br />"; $r=system("whoami",$ret); echo "<br />"; echo "r is $r,ret is $ret"; echo "<br />"; echo "=====exec========"; $r=exec("whoami",$ret); echo "<br />"; echo "r is $r,ret is $ret"; echo "<br />"; echo "=======passthru======"; echo "<br />"; passthru("whoami", $ret); echo "<br />"; echo "r is $r,ret is $ret"; ?> </body> </html>
输出结果:
=====system========
apache
r is apache,ret is 0
=====exec========
r is apache,ret is Array
=======passthru======
apache
r is apache,ret is 0