2011-10-13 160 views
1

當我們安裝一個程序(例如一個DBMS)時,它可以由shell命令本地運行;但爲了在PHP,Perl,Python等中運行它,我們需要適當的API /驅動程序。這可能會減慢進程併產生新的限制(例如,CBD不需要適應內存,但在Perl中需要使用CDB_File)。在PHP中執行shell腳本

問題1: shell是運行程序最快和最好的地方(不管我們的應用程序和目的)。

通常用exec()或shell_exec()在PHP內部執行ssh命令。但這是罕見的。

問題2:定期將php代碼與shell命令混合是否方便?創建一個長的shell腳本,然後通過exec(「./ shell.sh」)在php中運行它。這類網頁腳本是否存在安全問題或有問題?

問題3: PHP(和其他腳本語言)本身運行shell命令來執行進程(例如讀取文件或連接到數據庫)。對?因此,shell命令是不可避免的通過PHP或直接命令?

回答

2

除了hakre的評論....

這是常見的以exec()或內了shell_exec PHP執行SSH命令()。但這是罕見的。

撇開在2句刺目的矛盾,通過EXEC調用SSH /了shell_exec是一個非常愚蠢的想法。作爲一個快速黑客,你知道的密鑰對認證的地方,那麼它會解決這個問題 - 但更普遍的應用,你應該以使用正確的握手就有關流使用proc_open - 或ssh2 extension

關於Q3,沒有。在PHP提供函數的地方,幾乎不可避免地它會被當前進程/線程實現爲本地函數調用(我知道的唯一例外是POSIX系統上的mail()命令)。使用exec,shell_exec,passthru,popen等等,必須創建一個新的進程。

關於安全性....因爲web服務器(以及它的腳本)運行單個uid,所以除了用戶的權限和ulimit(例如base_opendir)之外,通常還有額外的限制 - 但這些限制不適用分離流程。因此,當您開始一個新流程時,您可以將上下文切換到不同的安全模型。

+0

感謝您的描述性答案。你的意思是說,當創建一個文件時,PHP直接與Linux內核通信? – Googlebot

+0

是的。只有內核實際上可以在文件系統上創建/讀取/寫入文件 - 並且沒有額外的過程來調用從PHP到OS的調用。 – symcbean

2

問題1: shell是最快最好的地方運行的程序(無論我們的應用程序和目的)。

這取決於是否該程序的命令行接口上與該程序或不對接最快的方法,如果該程序是CLI界面是運行程序的最佳途徑。所以這取決於程序。例如。你可以通過shell執行Firefox瀏覽器,但它不是最好的地方。

問題2:是否方便易[原文如此!],以定期與shell命令混合的PHP代碼?創建一個長的shell腳本,然後通過exec(「./ shell.sh」)在php中運行它。這類網頁腳本是否存在安全問題或有問題?

什麼方便與否取決於用戶在定期使用shell命令時的感受。當然,因爲在計算機上運行的所有東西都有安全隱患,所以對於shell腳本也是如此。

+0

1.我的意思是當我們運行firefox時,它將通過shell執行到OS Kerre。因此,這需要運行firefox的一半。 2.我的意思是在php中有很多shell命令可以嗎? – Googlebot

+1

@Ali:爲什麼不呢?在我看來,您應該始終使用該工具,該工具對於特定工作最適合。當它是一個shell腳本時,只需使用shell腳本 - 即使它是通過PHP執行的。但是:確保清理傳遞給shell腳本的任何(動態)參數(例如,使用* escapeshellarg *) – aurora

+0

這取決於。它可以,只要注意你清楚你如果混合流程就做了什麼。事實上,它實際上是執行shell腳本的web服務器的歷史,這就是CGI接口的誕生。您也可以使用PHP執行shell腳本,只需使用該語言作爲工具即可。 PHP通常是粘合的,將其他組件組合到服務器HTTP響應中。如果一個程序有一個PHP API,它通常更靈活,但是確保每個抽象/封裝都帶有一個價格。 Shell腳本通常更直接,但最終可能難以維護。這取決於你,你定義了界面。 – hakre