這篇文章給大家介紹的內容是關於PHP系統程式執行函數(system,passthru,exec)簡單分析(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。
exec — 執行一個外部程式
string exec ( string $command [, array &$output [, int &$return_var ]] )
範例
<?php echo exec("ls",$output); echo "</br>"; print_r($file);?>
執行結果:
test.php
Array( [0] => index.php [1] => test.php)
分析:
exec 不會主動返回執行結果,且只是返回結果的最後一行;
想要獲得完整的結果,需要第二個參數,讓其輸出到指定的數組,此數組一個記錄代表輸出的一行,而且反覆執行不同的系統外部命令時,在輸出每一條系統外部命令結果時清理unset()這數組,以防混亂;
第三個參數用來取得命令執行的狀態代碼,通常執行成功都是返回0。
passthru — 執行外部程式並且顯示原始輸出
void passthru ( string $command [, int &$return_var ] )
範例
<?php passthru("ls");?>
執行結果:
index.phptest.php
分析:
同 exec() 函數類似,也是用來執行外部命令,但直接將結果輸出到瀏覽器(未經任何處理的 原始輸出),沒有傳回值;
當需要輸出位元據,並且需要直接傳送到瀏覽器的時候,來使用這函數,如:直接輸出映像流的命令;
system — 執行外部程式,並且顯示輸出
string system ( string $command [, int &$return_var ] )
<?php system('ls', $retval);?>
分析:
直接將結果輸出到瀏覽器;
第二個參數是外部命令執行後的返回狀態;
成功則返回命令輸出的最後一行,失敗則返回 FALSE;
如果 PHP 運行在伺服器模組中,system() 函數還會嘗試在每行輸出完畢之後, 自動重新整理 網頁伺服器的輸出緩衝。
shell_exec — 通過 shell 環境執行命令,並且將完整的輸出以字串的方式返回。
說明
string shell_exec ( string $cmd )
反引號運算子“`”的效果與函數 shell_exec() 相同。
shell_exec 的傳回值
當進程執行過程中發生錯誤,或者進程不產生輸出的情況下,都會返回 NULL, 所以,使用本函數無法通過傳回值檢測進程是否成功執行。 如果需要檢查進程執行的退出碼,請使用 exec() 函數。
範例
<?php$output = `ls -al`;echo "<pre>$output</pre>";?>
注意:
反引號運算子在啟用了安全模式或者關閉了 shell_exec() 時是無效的。
與其它某些語言不同,反引號不能在雙引號字串中使用。
Example #1 shell_exec() 常式
當 PHP 運行在 安全模式 時,不能使用此函數。
<?php$output = shell_exec('ls -lart');echo "<pre>$output</pre>";?>
escapeshellarg
說明
string escapeshellarg ( string $arg )
escapeshellarg() 將給字串增加一個單引號並且能引用或者轉碼任何已經存在的單引號,這樣以確保能夠直接將一個字串傳入 shell 函數,並且還是確保安全的。對於使用者輸入的部分參數就應該使用這個函數。shell 函數包含 exec(), system() 執行運算子 。
參數
arg
需要被轉碼的參數。
傳回值
轉換之後字串。
範例
<?phpsystem('ls '.escapeshellarg($dir));?>
escapeshellcmd
說明
string escapeshellcmd ( string $command )
escapeshellcmd() 對字串中可能會欺騙 shell 命令執行任意命令的字元進行轉義。 此函數保證使用者輸入的資料在傳送到 exec() 或 system() 函數,或者 執行操作符 之前進行轉義。
反斜線(\)會在以下字元之前插入: &#;`|*?~<>^()[]{}$\, \x0A 和 \xFF。 ' 和 " 僅在不配對兒的時候被轉義。 在 Windows 平台上,所有這些字元以及 % 和 ! 字元都會被空格代替。
參數
command
要轉義的命令。
傳回值
轉義後的字串。
範例
<?php// 我們故意允許任意數量的參數$command = './configure '.$_POST['configure_options'];$escaped_command = escapeshellcmd($command); system($escaped_command);?>
Warning
escapeshellcmd() 應被用在完整的命令字串上。 即使如此,攻擊者還是可以傳入任意數量的參數。 請使用 escapeshellarg() 函數 對單個參數進行轉義。