PHP中exec,system等函数调用系统命令详解

    php的内置函数exec,system均可以调用系统命令(shell命令),固然还有passthru,escapeshellcmd等函数。

  在不少时候利用php的exec,system等函数调用系统命令能够帮助咱们更好更快的完成工做。好比前二天笔者在批量处理.rar文件时exec就帮我了大忙了。 php

  今天整理一下经常使用的调用系统函数发出来和你们分享经验。 html

  注意:要想使用这二个函数php.ini中的安全模式必须关闭,要否则为了安全起见php是不让调用系统命令的。 linux

  先看一下php手册对这二个函数的解释: web

  exec --- 执行外部程式 shell

  语法 : string exec ( string command [, array &output [, int &return_var]] ) 数组

  exec函数解析 浏览器

  exec语法: string exec(string command, string [array], int [return_var]); 安全

  exec返回值: 字符串 函数

  Exec参数说明 网站

  Command – 须要执行的命令

  Array –  是输出值

  return_var –是返回值0或1,若是返回0则执行成功,返回1则执行失败。

  exec不成功,调试方案

  一个技巧就是使用管道命令, 使用 2>&1, 命令就会输出shell执行时的错误到$output变量, 输出该变量便可分析。

  如:

  exec('convert a.jpg b.jpg', $output, $return_val);

  改成:

  exec('convert a.jpg b.jpg 2>&1', $output, $return_val);

  print_r($output);

  说明 :

  exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,若是你须要去执行一个命令,而且从命令去取得全部资料时,可使用passthru( )这个函数。

  若是有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 若是数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,若是你不想要此函数附加元素的话,你能够在传递此数组给exec( )以前呼叫unset( )。

  若是有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。

  注意 : 若是你容许来自使用者输入的资料,能够传递到此函数,那么你应该使用escapeshellcmd( )来肯定此使用者没法哄骗(trick)系统来执行武断的(arbitrary)命令。

  注意 : 若是你使用此函数来启动一个程式,并且但愿在背景里(background)执行的时候离开它,你必须肯定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,不然PHP将会悬挂(hang)直到程式执行结束。

  system --- 执行外部程式而且显示输出

  语法 : string system ( string command [, int &return_var] )

  说明 :

  system( )执行给予的命令command,而且输出结果。若是有给予参数return_var,则执行命令的状态码将会写到这个变量。

  注意 : 若是你容许来自使用者输入的资料,能够传递到此函数,那么你应该使用escapeshellcmd( )来肯定此使用者没法哄骗(trick)系统来执行武断的(arbitrary)命令。

  注意 : 若是你使用此函数来启动一个程式,并且但愿在背景里(background)执行的时候离开它,你必须肯定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,不然PHP将会悬挂(hang)直到程式执行结束。

  若是PHP是运做成伺服器模组,在输出每一行后,system( )会试着自动地清除web伺服器的输出缓冲。

  成功则传回命令的最后一行,失败则传回false。

  若是你须要去执行一个命令,而且从命令去取得全部资料时,可使用passthru( )这个函数。

  这二个都是用来调用系统shell命令,

  不一样点:

  exec能够把执行的结果所有返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败

  systerm不须要提供$output函数,他是直接把结果返回出来,一样$return_var是执行的状态码 0为成功 1为失败

    exec示例:

    <?php 
        $a = exec("dir",$out,$status); 
        print_r($a); 
        print_r($out); 
        print_r($status); 
    ?>

<?php  
    $a = exec("dir",$out,$status);  
    print_r($a);  
    echo "<br>-----------------------------------------------------<br>";
    echo "<pre>";
    //print_r($out); 
    var_dump($out);
    echo "</pre>";
    echo "<br>-----------------------------------------------------<br>";
    print_r($status);  
?>

    system示例:

    <?php 
        $a = system("dir",$out); 
        print_r($a); 
        print_r($out); 
    ?>

<?php 
    $a = system("dir",$out); 
    echo "<pre>";
    //print_r($a); 
    var_dump($a);
    echo "</pre>";
    echo "<br>-----------------------------------------------------<br>";
    print_r($out); 
?>

 你们能够运行一下看效果


PHP执行系统外部命令:exec()、passthru()、system()、shell_exec()

在php开发网站中,常常须要执行系统外部命令。php提供4种方法执行系统外部命令:exec()、passthru()、system()、 shell_exec()。下面一一介绍。在开始前,先检查下php配置文件php.ini中是有禁止这是个函数。找到 disable_functions,配置以下:

disable_functions =

若是“disable_functions=”后面有接上面四个函数,将其删除。默认php.ini配置文件中是不由止你调用执行外部命令的函数的。

方法一:exec()

function exec(string $command,array[optional] $output,int[optional] $return_value)

php代码:

<?php
        echo exec("ls",$file);
        echo "</br>";
        print_r($file);
?>

执行结果:

test.php
Array( [0] => index.php [1] => test.php)

知识点

exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,若是你想获得结果你可使用第二个参数,让其输出到指定的数组,此数组一个记录表明输出的一 行,即若是输出结果有20行,则这个数组就有20条记录,因此若是你须要反复输出调用不一样系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空 这个数组,以防混乱。第三个参数用来取得命令执行的状态码,一般执行成功都是返回0。

 

方法二:passthru()

function passthru(string $command,int[optional] $return_value)

代码:

<?php
        passthru("ls");
?>

执行结果:

index.phptest.php

知识点

passthru与system的区别,passthru直接将结果输出到浏览器,不须要使用 echo 或 return 来查看结果,不返回任何值,且其能够输出二进制,好比图像数据。

 

方法三:system()

function system(string $command,int[optional] $return_value)

代码:

<?php
        system("ls /");
?>

执行结果:

binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar

知识点

system和exec的区别在于system在执行系统外部命令时,直接将结果输出到游览器,不须要使用 echo 或 return 来查看结果,若是执行命令成功则返回true,不然返回false。第二个参数与exec第三个参数含义同样。

 

方法四:反撇号`和shell_exec()

shell_exec() 函数实际上仅是反撇号 (`) 操做符的变体

代码:

<?php
        echo `pwd`;
?>

执行结果:

/var/www/html
相关文章
相关标签/搜索