鑑於apache在我的服務器上運行的用戶是真實用戶並且具有帶有.history文件的主目錄,將通過exec()
運行命令會導致條目生成在那個文件中?PHP的exec()函數和.history文件
例如,如果我跑exec("whoami")
和我登錄作爲用戶和運行命令history
我會看到歷史的whoami
命令條目?
鑑於apache在我的服務器上運行的用戶是真實用戶並且具有帶有.history文件的主目錄,將通過exec()
運行命令會導致條目生成在那個文件中?PHP的exec()函數和.history文件
例如,如果我跑exec("whoami")
和我登錄作爲用戶和運行命令history
我會看到歷史的whoami
命令條目?
號
[email protected]:~ $ php -r 'exec("whoami");'
micha[email protected]:~ $ history |tail -n3
506 history |tail -n3
507 php -r 'exec("whoami");'
508 history |tail -n3
而對於Apache的情況:我嘗試過了,兩年前,看到它沒有歷史上的任何影響。只是嘗試一下,如果你不知道......
編輯:
只是阿里納斯...命令確實是shell來解釋,因爲你可以用這個簡單的例子看
$ php -r 'exec("echo foo $(bar2 jojo) go >/dev/tty");'
sh: bar2: command not found
foo go
這也正是同樣的輸出,因爲當我在這裏做這在命令行上直接
$ echo foo $(bar2 jojo) go >/dev/tty
-bash: bar2: command not found
foo go
重要的一點是,這屆如果它處於「交互模式」,e外殼只會將歷史命令添加到歷史記錄中。當您執行類似cat|bash
或bash -c $exec_command
時,不會創建任何歷史記錄條目。這就是exec()
所做的,順便說一句。這是一個像C命令一樣的調用execl("/bin/sh", "-c", exec_command, NULL);
歷史文件也被稱爲「bash歷史」,並且只與在bash內部創建的調用有關,webserver本身在自己的環境中運行,每個系統調用這個過程(沒有什麼比這更多的),沒有任何與bash的待辦事項;)
它與bash有很多關係。看看我的修改後的答案... – Michael
@Michael它沒有任何東西與bash混淆,因爲問題是關於「apache」和「php」。 – michabbb
內置的PHP函數'exec()'調用了bash shell,我在我的回答中證明了這一點 – Michael