首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 執行系統命令完整指南:exec、shell_exec 與安全配置

     編輯:PHP 綜合知識

前言

PHP 應用有時需要呼叫外部程式或系統指令(如影像處理、檔案轉換、系統管理)。本文說明在 Windows (WAMP) 環境下啟用命令執行的 PHP 設定、常用函數比較、除錯技巧與安全注意事項。

環境設定:啟用命令執行

  1. 開啟 php.ini
  2. 關閉安全模式:safe_mode = Off
  3. 從 disable_functions 移除需用的函數,例如:
    disable_functions = proc_open, popen, system, shell_exec
        
  4. 重啟 Apache/IIS 生效

常用執行函數比較

函數回傳值適用場景
exec()最後一行輸出(字串);可選參數接收完整輸出陣列與回傳碼需取得狀態碼、逐行處理輸出
shell_exec()完整輸出字串需完整輸出、不關心狀態碼
system()最後一行輸出;直接輸出至輸出緩衝即時顯示輸出、簡單腳本
passthru()無;直接輸出二進位資料圖片/二進位串流
proc_open()資源控制代碼;可雙向管道控制 stdin/stdout/stderr複雜互動、長時間程序

exec() 詳細語法與範例

string exec(string $command, array &$output = null, int &$return_var = null)
  • $command:欲執行的指令字串
  • $output:參考參數,接收每一行輸出(不含換行)
  • $return_var:參考參數,接收程式結束狀態碼(0 成功、非 0 失敗)

基本範例:建立目錄

<?php
exec("mkdir d:\\test", $out);
print_r($out); // 成功時通常為空陣列
// 執行後 D 槻將出現 test 資料夾
?>

除錯技巧:捕捉錯誤輸出

預設僅捕捉 stdout,stderr 會被丟棄。使用 2>&1 重導向 stderr 至 stdout:

// 原本無法得知轉檔失敗原因
exec('convert a.jpg b.jpg', $output, $return_val);

// 改為捕捉錯誤訊息
exec('convert a.jpg b.jpg 2>&1', $output, $return_val);
print_r($output); // 顯示 ImageMagick 錯誤細節

安全性警示

  1. 嚴禁直接帶入使用者輸入:必須經過 escapeshellcmd() 或 escapeshellarg() 轉義。
  2. 最小權限原則:Web 服務帳號不應擁有系統管理權限。
  3. 白名單機制:僅允許預先定義的指令集合。
  4. 考慮替代方案:純 PHP 函式庫(如 GD、Imagick PHP 擴充、ZipArchive)通常比呼叫外部程式更安全、可攜、效能佳。

常見問題排查

  • 執行無反應/失敗:檢查 `disable_functions`、路徑是否正確(使用絕對路徑)、權限是否足夠。
  • 中文路徑/參數亂碼:Windows 下指令編碼為 CP950/Big5,PHP 內部為 UTF-8,需用 iconv('UTF-8', 'CP950', $cmd) 轉換。
  • 長時間執行被中斷:調整 max_execution_time 或使用 proc_open 非阻塞模式。

總結

PHP 執行系統命令功能強大但風險極高。生產環境應盡量避免,若必須使用,請嚴格限制權限、驗證輸入、記錄稽核日誌,並優先評估純 PHP 替代方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved