本文章來給各位同學(xué)介紹關(guān)于在php中system,exec,passthru函數(shù)的一些使用方法,各位同學(xué)不防進(jìn)入?yún)⒖?
php提供了system(),exec(),passthru()這幾個函數(shù)來調(diào)用外部的命令.
他們的區(qū)別:
system() 輸出并返回最后一行shell結(jié)果,exec()不輸出結(jié)果,返回最后一行shell結(jié)果,所有結(jié)果可以保存到一個返回的數(shù)組里面.passthru()只調(diào)用命令,把命令的運(yùn)行結(jié)果原樣地直接輸出到標(biāo)準(zhǔn)輸出設(shè)備上.
相同點(diǎn):都可以獲得命令執(zhí)行的狀態(tài)碼
- ?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 )
一般系統(tǒng)會有兩種輸出,一種是系統(tǒng)狀態(tài)(return code),一種是輸出文字(output string),這三個 Function 主要就是這些回傳的差異.
system()
$last_line = system('ls', $return_var);
system() 會將輸出內(nèi)容直接印出,所以若於網(wǎng)頁,會將所有回傳內(nèi)容都顯示於頁面上.
$last_line: 只能取得最后一行的內(nèi)容
$return_var: 取得系統(tǒng)狀態(tài)回傳碼
exec()
exec('ls', $output, $return_var);
$output: 回傳內(nèi)容都會存於此變數(shù)中(儲存成陣列), 不會直接秀在頁面上.
$return_var: 取得系統(tǒng)狀態(tài)回傳碼
shell_exec()
$output = shell_exec('ls');
$output: 回傳內(nèi)容都會存於此變數(shù)中(儲存成純文字內(nèi)容),不會直接秀在頁面上在PHP中調(diào)用外部命令,可以用如下三種方法來實現(xiàn):
1)用PHP提供的專門函數(shù)
PHP提供共了3個專門的執(zhí)行外部命令的函數(shù):system(),exec(),passthru().
system()
原型:string system (string command [, int return_var])
返回結(jié)果
例子:system("/usr/local/bin/webalizer/webalizer");
exec()
exec()函數(shù)與system()類似,也執(zhí)行給定的命令,但不輸出結(jié)果,而是返回結(jié)果的最后一行.雖然它只返回命令結(jié)果的最后一行,但用第二個參數(shù)array 可以得到完整的結(jié)果,方法是把結(jié)果逐行追加到array的結(jié)尾處.所以如果array不是空的,在調(diào)用之前最好用unset()最它清掉.只有指定了第二 個參數(shù)時,才可以用第三個參數(shù),用來取得命令執(zhí)行的狀態(tài)碼.
實例代碼如下:
- exec("/bin/ls -l");
- exec("/bin/ls -l", $res);
- exec("/bin/ls -l", $res, $rc);
- passthru()
原型:void passthru (string command [, int return_var])
passthru()只調(diào)用命令,不返回任何結(jié)果,但把命令的運(yùn)行結(jié)果原樣地直接輸出到標(biāo)準(zhǔn)輸出設(shè)備上.所以passthru()函數(shù)經(jīng)常用來調(diào)用象pbmplus(Unix下的一個處理圖片的工具,輸出二進(jìn)制的原始圖片的流)這樣的程序.同樣它也可以得到命令執(zhí)行的狀態(tài)碼.
例子:
- header("Content-type: image/gif");
- passthru("./ppmtogif hunte.ppm");
2)用popen()函數(shù)打開進(jìn)程
上面的方法只能簡單地執(zhí)行命令,卻不能與命令交互.但有些時候必須向命令輸入一些東西,如在增加Linux的系統(tǒng)用戶時,要調(diào)用su來把當(dāng)前用戶換到 root才行,而su命令必須要在命令行上輸入root的密碼.這種情況下,用上面提到的方法顯然是不行的.
popen ()函數(shù)打開一個進(jìn)程管道來執(zhí)行給定的命令,返回一個文件句柄.既然返回的是一個文件句柄,那么就可以對它讀和寫了.在PHP3中,對這種句柄只能做單一的操作模式,要么寫,要么讀;從PHP4開始,可以同時讀和寫了.除非這個句柄是以一種模式(讀或?qū)懀┐蜷_的,否則必須調(diào)用pclose()函數(shù)來關(guān)閉它.
例子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的文檔,是作為一個秘技存在的.方法很簡單,用兩個反撇號把要執(zhí)行的命令括起來作為一個表達(dá)式,這個表達(dá)式的值就是命令執(zhí)行的結(jié)果.如:
- $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);
- ?>
- */
- ?>
新聞熱點(diǎn)
疑難解答