Site icon Mr. 沙先生

PHP 執行 shell cmd 的方法 ; system()、exec()、shell_exec()

本篇記錄 PHP 使用 system()、exec()、shell_exec() 執行 shell 的方法和差異,

 

依據官方的說明,system 會自動更新在 shell 內的每一行輸出更新

 

The system() call also tries to automatically flush the web server’s output buffer after each line of output if PHP is running as a server module.

<?php
system('ls -al', $out);
var_dump($out);
header('Content-type: application/json');
?>

#output
total 20
drwxr-xr-x   3 nginx nginx 4096 Jun 30 10:37 .
drwxr-xr-x. 11 root  root  4096 Jun 26 00:42 ..
-rw-r--r--   1 nginx nginx  816 Jun 30 10:36 cmd.php
-rw-r--r--   1 nginx nginx  246 May  4 12:15 index.php
drwxr-xr-x   6 nginx nginx 4096 May 19 17:32 share
int(0)

 

 

exec 將回傳的內容儲存在變數,並且為 array 的格式,適合用於處理參數

<?php
exec('ls -al', $out);
var_dump($out);
header('Content-type: application/json');
?>

#output
array(6) {
  [0]=>
  string(8) "total 20"
  [1]=>
  string(46) "drwxr-xr-x   3 nginx nginx 4096 Jun 30 10:45 ."
  [2]=>
  string(47) "drwxr-xr-x. 11 root  root  4096 Jun 26 00:42 .."
  [3]=>
  string(52) "-rw-r--r--   1 nginx nginx  811 Jun 30 10:45 cmd.php"
  [4]=>
  string(54) "-rw-r--r--   1 nginx nginx  246 May  4 12:15 index.php"
  [5]=>
  string(50) "drwxr-xr-x   6 nginx nginx 4096 May 19 17:32 share"
}

 

 

shell_exec 將回傳的內容儲存在變數,並且為純文字內容

<?php
$out = shell_exec('ls -al');
var_dump($out);
header('Content-type: application/json');
?>

#output
string(263) "total 20
drwxr-xr-x   3 nginx nginx 4096 Jun 30 10:49 .
drwxr-xr-x. 11 root  root  4096 Jun 26 00:42 ..
-rw-r--r--   1 nginx nginx  817 Jun 30 10:49 cmd.php
-rw-r--r--   1 nginx nginx  246 May  4 12:15 index.php
drwxr-xr-x   6 nginx nginx 4096 May 19 17:32 share
"

 

 

從範例看到幾種執行 shell 的差異,然後再選擇需要的 function 使用。

 

 

參考資料:

PHP: shell_exec – Manual

PHP: exec – Manual

PHP: system – Manual

PHP system()、exec()、shell_exec() 的 差異

Exit mobile version