• PHP执行外部命令【转】


    PHP是完全支持外部命令的,但是出于安全考虑,一般很少使用。

    PHP提供共了3种方法调用外部命令:

    (1)调用执行外部命令函数(system(),exec(),passthru(),shell_exec())

    (2)使用反撇号`执行命令

    (3)popen()函数打开进程

    下面来一一说明:

    一、调用执行外部命令函数

    1.exec()函数  string exec ( string $command [, array &$output [, int &$return_var ] )

    说明:这个函数不会直接输出结果,而是把结果输出到第二个参数(数组)中,第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

    //打印出当前文件目录及其文件信息
        exec("dir",$out);
        print_r($out);

    2.system()函数  string system ( string $command [, int &$return_var ] )

     说明:

    system在执行系统外部命令时,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。

    system("dir");

    3.passthru()函数 void passthru ( string $command [, int &$return_var ] )

    说明:passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。

    passthru ('echo $PATH');

    4.shell_exec()函数 string shell_exec ( string $cmd )

    /** by www.phpddt.com */
    $output = shell_exec('ls -l');
    var_dump($output);

    二、使用反撇号`执行命令

    echo `dir`;

    说明: 在使用这种方法执行系统外部命令时,要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。

    三、使用popen()打开进程,执行命令

    resource popen ( string $command , string $mode )

    说明:可以进行命令交互,popen( )函数打开一个进程管道来执行给定的命令,返回一个文件句柄,可以对它读和写。返回值和fopen()函数一样,返回一个文件指针。除非使用的是单一的模式打开(读or写),否则必须使用pclose()函数关闭。该指针可以被fgets(),fgetss(),fwrite()调用。出错时,返回FALSE。

     可以借鉴手册上这个例子:

    error_reporting(E_ALL);
    $handle = popen('/path/to/executable 2>&1', 'r');
    echo "'$handle'; " . gettype($handle) . "
    ";
    $read = fread($handle, 2096);
    echo $read;
    pclose($handle);

    在PHP中你这样做,可能会带来安全隐患的(详解PHP漏洞),当你使用这些函数来执行系统命令时,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。

  • 相关阅读:
    Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
    Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路
    HDU 4897 Little Devil I 树链剖分+线段树
    HDU 5405 Sometimes Naive 树链剖分+bit*****
    HDU 5274 Dylans loves tree 树链剖分+线段树
    BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
    HDU 5544 Ba Gua Zhen dfs+高斯消元
    HDU 3949 XOR 线性基
    BZOJ 2460: [BeiJing2011]元素 线性基
    Educational Codeforces Round 18 C. Divide by Three DP
  • 原文地址:https://www.cnblogs.com/whoamme/p/3345690.html
Copyright © 2020-2023  润新知