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

PHP 執行 Shell 命令:shell_exec 與 2>&1 重導向詳解

     編輯:PHP 相關知識

在 PHP 中呼叫系統命令時,正確捕獲標準輸出與標準錯誤至關重要。本文說明 shell_exec 搭配 2>&1 的用法與常見坑點。

基本用法

<?php
$message = shell_exec("sudo /usr/local/webserver/nginx/sbin/nginx -t 2>&1");
echo "運行結果: " . $message . "<br/>";
?>

關鍵點:2>&1 的作用

  • 2 代表標準錯誤輸出(stderr)。
  • 1 代表標準輸出(stdout)。
  • 2>&1 將 stderr 重導向到 stdout,使 shell_exec 能同時捕獲正常輸出與錯誤訊息。

若省略 2>&1,當命令輸出到 stderr 時,shell_exec 回傳空字串,導致以為命令無輸出或執行失敗。

其他執行命令函數對比

函數回傳值特點
shell_exec字串(完整輸出)適合捕獲完整輸出,內部用反引號 `cmd` 實現
exec最後一行輸出;第二參數接收所有輸出陣列可獲取退出碼(第三參數)
system最後一行輸出;直接輸出到瀏覽器類似 C 的 system(),適合即時顯示
passthru無;直接輸出二進制資料適合圖片、PDF 等二進制輸出
proc_open資源句柄;雙向管道最高控制權,可互動、非阻塞

安全警示

  • 嚴禁直接拼接用戶輸入到命令字串,必須使用 escapeshellarg()、escapeshellcmd()。
  • 避免使用 sudo,若必要請配置 /etc/sudoers 免密執行特定命令。
  • 考慮使用 Symfony Process、Laravel Process 等封裝庫,提供更安全的 API。

範例:安全執行並獲取退出碼

<?php
$cmd = "nginx -t";
$output = [];
$exitCode = 0;
exec(escapeshellcmd($cmd) . " 2>&1", $output, $exitCode);
echo "Exit Code: $exitCode\n";
echo "Output:\n" . implode("\n", $output);

掌握重導向與函數差異,能讓你在 PHP 中安全、可靠地呼叫外部程式。

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