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
相關文章
相關標籤/搜索