本文章來給各位同學介紹關于在php中system,exec,passthru函數的一些使用方法,各位同學不防進入參考.
php提供了system(),exec(),passthru()這幾個函數來調用外部的命令.
他們的區別:
system() 輸出并返回最后一行shell結果,exec()不輸出結果,返回最后一行shell結果,所有結果可以保存到一個返回的數組里面.passthru()只調用命令,把命令的運行結果原樣地直接輸出到標準輸出設備上.
相同點:都可以獲得命令執行的狀態碼
- ?ystem()、exec()、shell_exec() 官方文件?明如下:
- system — Execute an external program and display the output
- string system ( string $command [, int &$return_var ] )
- exec — Execute an external program
- string exec ( string $command [, array &$output [, int &$return_var ]] )
- shell_exec — Execute command via shell and return the complete output as a string
- string shell_exec ( string $cmd )
- ystem()、exec()、shell_exec() 官方文件說明如下:
- system — Execute an external program and display the output
- string system ( string $command [, int &$return_var ] )
- exec — Execute an external program
- string exec ( string $command [, array &$output [, int &$return_var ]] )
- shell_exec — Execute command via shell and return the complete output as a string
- string shell_exec ( string $cmd )
一般系統會有兩種輸出,一種是系統狀態(return code),一種是輸出文字(output string),這三個 Function 主要就是這些回傳的差異.
system()
$last_line = system('ls', $return_var);
system() 會將輸出內容直接印出,所以若於網頁,會將所有回傳內容都顯示於頁面上.
$last_line: 只能取得最后一行的內容
$return_var: 取得系統狀態回傳碼
exec()
exec('ls', $output, $return_var);
$output: 回傳內容都會存於此變數中(儲存成陣列), 不會直接秀在頁面上.
$return_var: 取得系統狀態回傳碼
shell_exec()
$output = shell_exec('ls');
$output: 回傳內容都會存於此變數中(儲存成純文字內容),不會直接秀在頁面上在PHP中調用外部命令,可以用如下三種方法來實現:
1)用PHP提供的專門函數
PHP提供共了3個專門的執行外部命令的函數:system(),exec(),passthru().
system()
原型:string system (string command [, int return_var])
返回結果
例子:system("/usr/local/bin/webalizer/webalizer");
exec()
exec()函數與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最后一行.雖然它只返回命令結果的最后一行,但用第二個參數array 可以得到完整的結果,方法是把結果逐行追加到array的結尾處.所以如果array不是空的,在調用之前最好用unset()最它清掉.只有指定了第二 個參數時,才可以用第三個參數,用來取得命令執行的狀態碼.
實例代碼如下:
- exec("/bin/ls -l");
- exec("/bin/ls -l", $res);
- exec("/bin/ls -l", $res, $rc);
- passthru()
原型:void passthru (string command [, int return_var])
passthru()只調用命令,不返回任何結果,但把命令的運行結果原樣地直接輸出到標準輸出設備上.所以passthru()函數經常用來調用象pbmplus(Unix下的一個處理圖片的工具,輸出二進制的原始圖片的流)這樣的程序.同樣它也可以得到命令執行的狀態碼.
例子:
- header("Content-type: image/gif");
- passthru("./ppmtogif hunte.ppm");
2)用popen()函數打開進程
上面的方法只能簡單地執行命令,卻不能與命令交互.但有些時候必須向命令輸入一些東西,如在增加Linux的系統用戶時,要調用su來把當前用戶換到 root才行,而su命令必須要在命令行上輸入root的密碼.這種情況下,用上面提到的方法顯然是不行的.
popen ()函數打開一個進程管道來執行給定的命令,返回一個文件句柄.既然返回的是一個文件句柄,那么就可以對它讀和寫了.在PHP3中,對這種句柄只能做單一的操作模式,要么寫,要么讀;從PHP4開始,可以同時讀和寫了.除非這個句柄是以一種模式(讀或寫)打開的,否則必須調用pclose()函數來關閉它.
例子1:
- $fp=popen("/bin/ls -l", "r");
例子2:
實例代碼如下:
- */
- $sucommand = "su --login root --command";
- $useradd = "useradd ";
- $rootpasswd = "verygood";
- $user = "james";
- $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
- $fp = @popen($user_add,"w");
- @fputs($fp,$rootpasswd);
- @pclose($fp);
- ?>
3)用反撇號(`,也就是鍵盤上ESC鍵下面的那個,和~在同一個上面)
這個方法以前沒有歸入PHP的文檔,是作為一個秘技存在的.方法很簡單,用兩個反撇號把要執行的命令括起來作為一個表達式,這個表達式的值就是命令執行的結果.如:
- $res='/bin/ls -l';
- echo '
- '.$res.'
- ';
這個腳本的輸出就象:
- hunte.gif
- hunte.ppm
- jpg.htm
- jpg.jpg
- passthru.php
范例程式
實例代碼如下:
- echo "nsystem";
- $last_line = system('ls', $return_var);
- echo "nreturn_var:";
- print_r($return_var);
- echo "nlast_line:";
- print_r($last_line);
- echo "nnexec";
- exec('ls', $output, $return_var);
- echo "nreturn_var:";
- print_r($return_var);
- echo "noutput:";
- print_r($output);
- echo "nnshell_exec";
- $output = shell_exec('ls');
- echo "noutput:";
- print_r($output);
- ?>
- */
- ?>
新聞熱點
疑難解答