我覺得,可能在CGI下,無法使用setuid這個功能。
這是權限問題,就跟我前面提到的一樣, 一般 user 無法切換為 root, 但 root 可以切換為任何 user.
若下system("ls -al")是無法執行的,很多command在CGI環境無法執行。
我發覺:需要show message在螢幕的指令,都無法執行,如 ls -al, pwd等等。
或者Daemon也無法執行。
可以執行,下面是我剛剛寫的一段 code, httpd 的身分是 apache
#include <stdio.h>
int main( int argc, char* argv[] )
{
printf("Content-type: text/plain\n\n");
fflush( stdout );
system("ls -l");
exit(0);
}
您講的popen,我同學也跟我提過,不過這個不是開檔案用的嗎?請問要如何使用這個函數呢?
這不是開檔案用的,我不知道你有沒有 man 一下?
這是用來執行一個執行檔,並讀取其執行結果的 function.
你可以試試這段 code
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp;
char s_line[1024];
printf("=====\n");
fp=popen("tar cvzf gdbm.tar.gz gdbm 2>&1","r");
if(fp==NULL)
exit(-1);
while(!feof(fp)) {
fgets( s_line, 1024, fp );
printf(">%s",s_line);
}
pclose(fp);
}
我有找到一個super套件,可以將某些指令在執行前,change成root。
如果你放在 system() 裡面,那還是一樣啊,因為執行 system() 的這個 CGI, 仍然是以 httpd 的身分(apache或www)在執行,所以仍然是沒辦法切換成 root.
我的意思是在你寫好此 CGI 之後,將權限改為 SUID, owner 改為 root, 應該就可以了.
這樣子執行此 CGI 時,會以 root 身分執行起來.