php執(zhí)行系統(tǒng)命令有四個(gè)常用函數(shù):1.exec()執(zhí)行命令并返回最后一行輸出,可傳數(shù)組獲取全部結(jié)果;2.shell_exec()返回完整輸出結(jié)果,適合一次性獲??;3.system()直接輸出命令結(jié)果,可接收狀態(tài)碼;4.權(quán)限控制需過(guò)濾輸入,使用escapeshellarg()等函數(shù)防止注入,避免拼接用戶輸入,生產(chǎn)環(huán)境建議禁用這些函數(shù),確保web服務(wù)器用戶權(quán)限低。
PHP 要執(zhí)行系統(tǒng)命令,有幾個(gè)常用函數(shù)可以實(shí)現(xiàn)。這些函數(shù)在某些場(chǎng)景下非常有用,比如執(zhí)行 shell 命令、調(diào)用腳本、處理文件等。但也要注意安全問(wèn)題,不能隨便開放給外部輸入。
下面介紹幾個(gè)常用的函數(shù)和使用建議。
exec() 函數(shù)
exec() 是最常用的執(zhí)行系統(tǒng)命令的函數(shù)之一。它會(huì)執(zhí)行一個(gè)外部命令,并返回最后一行輸出內(nèi)容。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
基本用法:
$output = exec('ls -l'); echo $output;
這個(gè)例子會(huì)列出當(dāng)前目錄下的文件,并輸出最后一行結(jié)果。如果你需要獲取完整輸出,可以傳入第二個(gè)參數(shù):
exec('ls -l', $outputArray); print_r($outputArray);
這樣就能拿到所有輸出行,放在數(shù)組里。
注意:如果命令中包含用戶輸入,一定要做好過(guò)濾和驗(yàn)證,防止命令注入攻擊。
shell_exec() 函數(shù)
shell_exec() 也是執(zhí)行系統(tǒng)命令的函數(shù),但它返回的是完整的輸出結(jié)果(包括換行符),適合一次性獲取全部輸出。
用法示例:
$output = shell_exec('whoami'); echo "當(dāng)前用戶是:$output";
相比 exec(),它更簡(jiǎn)潔一些,不需要處理數(shù)組。
不過(guò)同樣要注意安全性,尤其是拼接字符串執(zhí)行命令時(shí),容易被惡意用戶利用。
system() 函數(shù)
system() 和 exec() 類似,但它會(huì)直接輸出命令的結(jié)果,而不是只返回最后一行。
示例:
system('ls -la');
這個(gè)函數(shù)適合需要實(shí)時(shí)看到命令輸出的場(chǎng)景,比如調(diào)試或運(yùn)行長(zhǎng)時(shí)間任務(wù)。
還有一個(gè)可選參數(shù)可以接收狀態(tài)碼:
system('ls -la', $status); echo "命令執(zhí)行狀態(tài)碼:" . $status;
狀態(tài)碼為 0 通常表示成功,非零則可能出錯(cuò)。
安全建議與注意事項(xiàng)
-
避免直接拼接用戶輸入
比如不要寫成這樣:exec("ping " . $_GET['host']);
這樣很容易被注入其他命令,例如 127.0.0.1; rm -rf /。
正確做法是對(duì)輸入做白名單過(guò)濾,或者使用安全函數(shù)如 escapeshellarg() 或 escapeshellcmd()。
-
盡量不啟用這些函數(shù)
在生產(chǎn)環(huán)境中,如果不是必須的功能,建議禁用這些函數(shù)。可以在 php.ini 中設(shè)置:disable_functions = exec,shell_exec,system,passthru,...
-
權(quán)限控制要到位
PHP 執(zhí)行系統(tǒng)命令時(shí),是以 Web 服務(wù)器的運(yùn)行用戶身份進(jìn)行的。確保這個(gè)用戶的權(quán)限足夠低,防止誤操作或惡意行為造成嚴(yán)重后果。
基本上就這些。這幾個(gè)函數(shù)各有特點(diǎn),根據(jù)實(shí)際需求選擇即可。用的時(shí)候多留心安全問(wèn)題,別圖省事。