萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 執行系統指令函數比較:system, exec, passthru, shell_exec, popen

詳細比較 PHP 五種執行外部指令的函數:輸出方式、回傳值、適用場景、安全風險與最佳實踐。

五大函數對照表

函數輸出方式回傳值取得完整輸出取得狀態碼典型用途
system()直接輸出到標準輸出最後一行字串否第 2 參數簡單指令、直接顯示結果
exec()不輸出最後一行字串第 2 參數 (陣列)第 3 參數需處理輸出、取得狀態碼
passthru()直接輸出 (二進位安全)無 (void)否第 2 參數圖片串流、二進位輸出
shell_exec()/` `不輸出完整輸出字串回傳值即完整輸出無需完整輸出文字
popen()管道讀/寫檔案指標fread/fgets 讀取pclose() 回傳雙向互動、長時間程序

程式碼範例

<?php
// system()
$last = system('ls -la', $ret); // 直接顯示,$last 為最後一行

// exec()
exec('ls -la', $out, $ret); // $out 為陣列每一行,$ret 狀態碼

// passthru() - 輸出圖片
header('Content-Type: image/png');
passthru('./generate_png.sh', $ret);

// shell_exec() / 反引號
$out = shell_exec('ls -la'); // 完整字串
$out = `ls -la`;             // 同 shell_exec()

// popen() 雙向互動
$fp = popen('su -c "useradd james"', 'w');
fwrite($fp, 'root_password');
pclose($fp);
?>

安全警示(極重要)

  • 命令注入:使用者輸入**絕不可**直接拼接指令。必須用 escapeshellarg()、escapeshellcmd() 轉義,或改用 proc_open() 陣列式參數繞過 Shell。
  • 停用函數:生產環境 php.ini 建議 disable_functions = exec,shell_exec,system,passthru,popen,proc_open。
  • 權限最小化:Web Server 用戶不可為 root,指令執行權限嚴格限制。
  • 替代方案:純 PHP 實作(如 mkdir()、unlink()、Imagick、FFMpeg PHP 封裝)優於呼叫外部指令。

反引號 ` ` 補充

等同 shell_exec(),不支援狀態碼取得,錯誤輸出需 2>&1 重導向。不建議使用(可讀性差、語法高亮支援差)。

copyright © 萬盛學電腦網 all rights reserved