我試圖與設置setuid位的python腳本執行。屬於用戶'bgmc'的程序必須在目錄'/ home/bgmc'中創建一些文件,但是被另一個用戶'client'調用。事實上,我不希望用戶'客戶'更改程序創建的文件。我使用的C-包裝調用程序(見setuid on shell scripts):如何在非root用戶的程序中設置setuid位?
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("/home/bgmc/myprogram.sh");
return 0;
}
我設置程序的setuid位。當c編譯的程序屬於根目錄時,程序運行良好並創建預期的文件。在C編譯程序的性能,那麼:
8 -rws--x--x 1 root root 4657 Mar 2 16:25 myprogram
然而,當我更改用戶組myprogram來bgmc:bgmc,程序不能再創建文件:「權限被拒絕」。我試圖改變行:
setuid(0);
與:
setuid(1002);
由於1002是 'bgmc' 的用戶ID(我使用命令 「ID -u bgmc」 此),但是這沒」幫助。
我寧願不給該程序的root訪問權限。有沒有辦法來防止這種情況?
謝謝您的回答。既然你說過setuid shell腳本是很危險的,我試着設置腳本來代替。然而,這似乎並不奏效,儘管我的目錄具有正確的權限(775)。在Linux下,setgid腳本既沒有效果?我應該在這種情況下製作一個c-wrapper嗎? – 2012-03-07 10:42:55
setgid的問題與setuid相同。無論組擁有什麼權限,您都可以爲系統上的所有用戶授予這些權限,因爲利用腳本獲取這些權限並不重要。因此,內核不支持腳本中的setgid。 – 2012-03-07 14:12:22
謝謝!我用你說的'execve'(或者更確切地說'execle',我想這些都是等價的)並且給它一個空的環境。我的問題是:究竟應該怎樣清除這種方式?因爲通過清除環境,我的程序無法再對python中的某些庫(包含「import」;即「import matplotlib.pyplot」)進行重寫。所以,我寧願不明確的一切.. – 2012-03-07 16:17:03