最新消息: 生命不止,奋斗不息……

PHP 调用系统外部命令 system() exec() passthru() 和 popen()

PHP admin 829浏览 0评论

79_120224133619_1

一 用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
#include
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程序

<?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";
 ?>

输出结果:

=====system========

apache
r is apache,ret is 0
=====exec========
r is apache,ret is Array
=======passthru======
apache
r is apache,ret is 0

转载请注明:IT世界 » PHP 调用系统外部命令 system() exec() passthru() 和 popen()

您必须 登录 才能发表评论!