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

PHP 執行系統命令完全指南:exec/system/shell_exec 實戰與安全配置

     編輯:PHP 相關知識

環境準備:打破安全模式限制

在 WAMP 等集成環境中,需修改 php.ini:

safe_mode = Off
; 從 disable_functions 移除 exec, system, shell_exec, passthru, popen, proc_open
disable_functions = 

重啟 Apache 生效。

核心函數對比

函數返回值適用場景獲取輸出方式
exec()最後一行輸出需獲取返回碼、逐行處理輸出第二參數 &$output 數組
system()最後一行輸出直接輸出到瀏覽器、需返回碼第二參數 &$return_var
shell_exec()完整輸出字符串需獲取完整輸出、無需返回碼直接返回
passthru()無二進制輸出(圖片/PDF)直接輸出

實戰代碼示例

1. 執行目錄創建 (exec)

2. 捕獲錯誤輸出 (關鍵技巧)

exec('convert a.jpg b.jpg 2>&1', $output, $return_val);
print_r($output); // 包含 stderr 輸出

2>&1 將標準錯誤重定向到標準輸出,避免靜默失敗。

3. 非阻塞後台執行

// Windows
exec("start /B php long_task.php > nul 2>&1");
// Linux
exec("php long_task.php > /dev/null 2>&1 &");

安全警示(必讀)

  • 極度危險: 絕不直接拼接用戶輸入到命令中!
  • 必須轉義: 使用 escapeshellcmd() (命令本身) 和 escapeshellarg() (參數)。
  • 最小權限: Web 服務器用戶權限應極低,禁用高危命令 (rm, chmod, wget 等)。
  • 替代方案: 能用 PHP 內置函數 (文件操作、圖片處理、網絡請求) 絕不調用 Shell。

常見問題排查

  • 命令不存在: 使用絕對路徑 /usr/bin/convert,或設置 PATH。
  • 權限不足: 檢查文件/目錄權限、SELinux/AppArmor 策略。
  • 超時: 設置 set_time_limit() 或使用非阻塞模式。
  • 編碼亂碼: Windows 下 iconv('GBK', 'UTF-8', $output) 轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved