2016年6月30日 星期四

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

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



 

  • system()


依據官方的說明,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()


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()


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() 的 差異

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

沒有留言:

張貼留言