一 用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