phpsystemexec
A. php怎麼運行EXEC文件
在PHP中調用外部命令,可以用如下三種方法來實現:
1、用PHP提供的專門函數
(1)PHP提供共了3個專門的執行外部命令的函數:system(),exec(),passthru()。
(2)system() 原型:string system (string command [, int return_var])
(3)system()函數很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個參數旦宴悶是可選的,用來得到命令執行後的狀態碼。
2、例子:模彎
代碼如下:
<?php
system("/usr/local/bin/webalizer/webalizer");
?>
exec()
(1)原型:string exec (string command [, string array [, int return_var]]) exec
(2)()函數與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個參數array 可以得到完整的結果,方法是把結果逐行追加到array的結尾處。祥高所以如果array不是空的,在調用之前最好用unset()最它清掉。只有指定了第二 個參數時,才可以用第三個參數,用來取得命令執行的狀態碼。
B. 6.如何禁止php服務程序中不安全的功能
為了使php程序更安全,很多站長都選擇了禁用一些比較敏感的函數,那影響php安全的函數到底有哪些呢,下面我們列出了一些:
1、phpinfo()
功能描述:輸出 PHP 環境信息以及相關的模塊、WEB 環境等信息。
危險等級:中
2、passthru()
功能描述:允許執行一個外部程序並回顯輸出,類似於 exec()。
危險等級:高
3、exec()
功能描述:允許執行一個外部程序(如 UNIX Shell 或 CMD 命令等)。
危險等級:高
4、system()
功能描述:允許執行一個外部程序並回顯輸出,類似於 passthru()。
危險等級:高
5、chroot()
功能描述:可改變當前 PHP 進程的工作根目錄,僅當系統支持 CLI 模式
PHP 時才能工作,且該函數不適用於 Windows 系統。
危險等級:高
6、scandir()
功能描述:列出指定路徑中的文件和目錄。
危險等級:中
7、chgrp()
功能描述:改變文件或目錄所屬的用戶組。
危險等級:高
8、chown()
功能描述:改變文件或目錄的所有者。
危險等級:高
9、shell_exec()
功能描述:通過 Shell 執行命令,並將執行結果作為字元串返回。
危險等級:高
10、proc_open()
功能描述:執行一個命令並打開文件指針用於讀取以及寫入。
危險等級:高
11、proc_get_status()
功能描述:獲取使用 proc_open() 所打開進程的信息。
危險等級:高
12、error_log()
功能描述:將錯誤信息發送到指定位置(文件)。
安全備註:在某些版本的 PHP 中,可使用 error_log() 繞過 PHP safe mode,
執行任意命令。
危險等級:低
13、ini_alter()
功能描述:是 ini_set() 函數的一個別名函數,功能與 ini_set() 相同。
具體參見 ini_set()。
危險等級:高
14、ini_set()
功能描述:可用於修改、設置 PHP 環境配置參數。
危險等級:高
15、ini_restore()
功能描述:可用於恢復 PHP 環境配置參數到其初始值。
危險等級:高
16、dl()
功能描述:在 PHP 進行運行過程當中(而非啟動時)載入一個 PHP 外部模塊。
危險等級:高
17、pfsockopen()
功能描述:建立一個 Internet 或 UNIX 域的 socket 持久連接。
危險等級:高
18、syslog()
功能描述:可調用 UNIX 系統的系統層 syslog() 函數。
危險等級:中
19、readlink()
功能描述:返回符號連接指向的目標文件內容。
危險等級:中
20、symlink()
功能描述:在 UNIX 系統中建立一個符號鏈接。
危險等級:高
C. PHP如何持續執行一個函數
PHP提供4個專門的執行外部命令的函數:exec(), system(), passthru(), shell_exec()
1)exec()
原型: string exec ( string $command [, array &$output [, int &$return_var ]] )
說明: exec執行系統外部命令時不會輸出結果,而是返回結果的最後一行。如果想得到結果,可以使用第二個參數,讓其輸出到指定的數組。此數組一個記錄代表輸出的一行。即如果輸出結果有20行,則這個數組就有20條記錄,所以如果需要反復輸出調用不同系統外部命令的結果,最好在輸出每一條系統外部命令結果時清空這個數組unset($output),以防混亂。第三個參數用來取得命令執行的狀態碼,通常執行成功都是返回0。
<?php
exec("dir",$output);
print_r($output);
?>
2)system()
原型: string system ( string $command [, int &$return_var ] )
說明: system和exec的區別在於,system在執行系統外部命令時,直接將結果輸出到游覽器,如果執行命令成功則返回true,否則返回false。第二個參數與exec第三個參數含義一樣。
<?php
system("pwd");
?>
3)passthru()
原型: void passthru ( string $command [, int &$return_var ] )
說明: passthru與system的區別,passthru直接將結果輸出到游覽器,不返回任何值,且其可以輸出二進制,比如圖像數據。第二個參數可選,是狀態碼。
<?php
header("Content-type:image/gif");
passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm");
?>
4)shell_exec()
原型: string shell_exec(string $cmd)
說明: 直接執行命令$cmd
<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>
防超時的處理方法:
當執行命令的返回結果非常龐大時,可以需要考慮將返回結果輸出至其他文件,再另行讀取文件,這樣可以顯著提高程序執行的效率。
如果要執行的命令要花費很長的時間,那麼應該把這個命令放到系統的後台去運行。但在默認情況下,
象system()等函數要等到這個命令運行完才返回(實際上是在等命令的輸出結果),
這肯定會引起PHP腳本的超時。解決的辦法是把命令的輸出重定向到另外一個文件或流中,如:
<?php
system("/usr/local/bin/order_proc > /tmp/abc ");
?>
<?
$filename=time().".data";
exec("/app/gm/gm_center/test/hello.py > $filename",$output);
var_mp ($output);
?>