php 赋予最高权限,为PHP执行赋予root权限(一)
這幾天弄的東西涉及到php利用shell腳本與Linux的交互,我們知道利用php運行腳本來訪問Linux是以Apach的身份來執行的,因此它自己能夠所做的事情很少的,因為沒有足夠的權限,這里就涉及到要將為php執行的時候賦予root權限。
接下來介紹的這種方法,我自己是親自做了的,可以實現,但是畢竟有它的缺點,這里跟大家分享一下,希望大家有什么好的做法可以提示一下:
這是利用C來實現互換權限的,如果你想徹底明白到底為什么接下來的程序可以運行成功,請徹底弄清楚SUID與SGID到底起什么作用。
#include
#include
#include
#include
int main()
{
uid_t uid , euid ;
uid = getuid();
euid= geteuid();
// printf("my uid:%u\n",getuid());
// printf("my euid:%u\n",geteuid());
if(setreuid(euid,uid))
perror("setreuid");
// printf("after setreuid uid:%u\n",getuid());
// printf("after setreuid euid:%u\n",geteuid());
system("/home/houqingdong/myshell/mkdir.sh /home/ hou_test");
return 0;
}
其中的主要函數說明:
1.getuid()所需要的頭文件為:
#include
#include
函數原型:uid_t getuid(void);
函數說明:uid_t是定義在sys/types.h中的,其實就是unsigned int類型,函數返回一個調用程序的真
實用戶的ID。
2. geteuid()
函數原型:uid_t geteuid(void);
函數說明:geteuid()用來取得執行目前進程有效的用戶識別碼。有效的用戶識別碼用來決定進程執行
的權限,借由此改變此值進程可以獲得額外的權限。倘若執行文件的setID位已被設置,該文件執行時,
其進程的euid值便會設成該文件的所有者的uid。例如,執行文件/usr/bin/myshell.sh的權限為:-r-s-
-x--x,其s位即為setID(SUID)位,而當任何用戶在執行myshell.sh時其有效的用戶識別碼會被設成為
myshell.sh所有者的uid,即root的uid值為0.
3. setreuid();? 可以理解為交換ID
編譯該文件:???? gcc -o run -Wall run.c??? 生成可執行文件run
接下來做的是最重要的一步,為run賦予suid的權限:chmod u+s run?? 它的作用是設置uid,當普通用戶執行的時候是以root的權限來執行的,在run.c里面會交換進程的ID,從而利用root的ID為0,來執行,權限就可想而知了。
但是利用這個方法有一個很不好的地方,在run.c中,我執行的命令是:system("/home/houqingdong/myshell/mkdir.sh /home/ hou_test");?? mkdir.sh是我自己寫的腳本,而后面的兩個參數是寫死的,也就是說參數的傳遞非常不方便,當然如果你執行一些不需要傳遞參數的程序,這個方法還是很可行的,而我想做的是用戶選擇Linux下的某個目錄,可以在這里面創建文件file或者目錄directory,此時的參數就非常不好辦了。
關于這個問題還嘗試了另一種方法:
就是直接將自己寫的shell腳本,執行:? chmod 777 mkdir.sh??????????????? chmod u+s mkdir.sh
這樣我調用mkdir.sh的時候同樣是以root的身份來執行的,但是我在網頁端運行的時候,仍然報錯,初步認定為我要創建文件的那個目錄下Apache的權限不夠,我嘗試著將權限改為: chmod -R 777 /home/???? 然后在運行就可以創建成功了,但是這樣為Apache添加權限的方法是很不正規的吧,我知道如何為Apache添加主目錄和虛擬目錄的權限
但是這樣的就不知道了,總不能都改權限吧。
我知道我以上的方法肯定有很多地方存在不足的,無論是從可行性,還是從安全性,所以如果您恰好看到這篇文章,恰好知道更好的做法,愿您能夠花費一點時間為我提示一下,不勝感激,謝謝!!
總結
以上是生活随笔為你收集整理的php 赋予最高权限,为PHP执行赋予root权限(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tsp 选边 matlab,【转载】蚁群
- 下一篇: android通过php判断用户是否注册