2016-01-15 43 views
1

它的一些實驗似乎setresuid /的setresgid在C工作與不同的Python和我不太知道爲什麼。如果我有以下的短的C程序:爲什麼setresuid /的setresgid Python中的作品不同與ç

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
    setresuid(999, 999, 999); 
    setresgid(999, 999, 999); 
    system("/some/program"); 
    return 0; 
} 

和二進制有setuid位和二進制是在組999和所有者999,運行這個二進制文件以其他用戶身份運行/一些/程序作爲用戶999這是你所期望的,因爲我相信setuid位背後的想法是允許程序以文件的組/所有者權限運行。

在另一方面,如果我有以下的短Python程序:

#!/usr/bin/python 
import os 
import subprocess 

os.setresuid(999,999,999) 
subprocess.check_output('/some/program', shell=True) 

和python腳本有setuid位,在組999和用戶999所擁有,運行腳本作爲另一個用戶給出錯誤:

Traceback (most recent call last): 
    File "/foo/bar/sample.py", line 5, in <module> 
    os.setresuid(999,999,999) 
OSError: [Errno 1] Operation not permitted 

任何想法,爲什麼這可能是?

+0

是的,Python腳本有setuid位設置爲好。我更新了我的描述。 – blischalk

+0

我的猜測是Python運行時抱怨無效操作,而C系統調用只返回-1。你能打印'setr​​esuid()'的返回值嗎? – chqrlie

+1

您可能更喜歡這樣的問題:「我如何將系統特權授予python程序,類似於我將setuid編譯的二進制文件?」因爲現在你的問題得到了解答,但你可能仍然有一個需要解決的問題。 –

回答

3

執行一個解釋的腳本是從執行已編譯的二進制不同。在解釋腳本的情況下,實際執行的是解釋器,而不是腳本本身。由於這個原因,腳本中的setuid沒有任何影響。在這種情況下,您必須setuid解釋器,即python。這不被推薦。

+0

文件系統功能,例如'CAP_SETUID'可以在腳本上運行。 – jordanm

+1

這似乎是合理的,但有趣的是,實際運行該腳本的通常用戶和組權限將得到尊重,但setuid功能不是。如果必須在解釋器上設置setuid,而不是腳本中爲什麼權限可以在腳本級別運行? – blischalk

相關問題