2013-03-29 49 views
10

在我的Python腳本中,我執行一些需要root權限的操作。我還創建並寫入文件,我不想由root用戶獨佔,而是由正在運行腳本的用戶擁有。在Python中刪除某些操作的root權限

通常,我使用sudo運行我的腳本。有沒有辦法做到上述?

+0

如果你使用'sudo'運行,你可以隨時'後您chown'到'__FILE__'的所有者大功告成 – slezica

+0

@uʍopǝpısdn是的......但這樣做這樣的事情很快就變得活潑,如果你不小心。 – thejh

+0

我沒有明白,對不起。創建所有文件的根源('sudo'的後果)。我如何檢索運行腳本的用戶的用戶ID? –

回答

10

可以UID的使用os.seteuid()之間切換。這不同於os.setuid()中,你可以回去獲得root權限,當你需要他們。

例如,運行以下爲根:

import os 

open('file1', 'wc') 

# switch to userid 501 
os.seteuid(501) 
open('file2', 'wc') 

# switch back to root 
os.seteuid(0) 
open('file3', 'wc') 

這將創建file1file3爲根,但file2與UID 501

如果要確定哪些用戶被呼叫用戶您的腳本sudo設置了兩個環境變量:

SUDO_USER 
SUDO_UID 

分別用戶名稱和呼叫sudo的用戶的uid。所以,你可以使用int(os.environ['SUDO_UID'])os.seteuid()使用。

1

http://linux.die.net/man/8/sudo報價:
的真實和有效的UID和GID設置爲匹配目標用戶的

所以,你只需要知道使用哪個用戶的選擇是,無論是從配置讀取目標用戶文件或cmdline選項,或某種方式的啓發式猜測。

一個好主意就是所謂的權利流失:從root權限開始,然後執行你爲他們定義的權限。然後成爲一個權限較低的用戶。
你會使用os模塊爲: http://docs.python.org/2/library/os.html#os.setuid

1

我發現使用os.seteuid和os.setegid並沒有真正刪除root權限。在給他們打電話之後,我仍然可以做需要root權限的事情。我找到了解決方案,它的工作是使用os.setresuid,而是os.setresgid:

sudo_uid = int(os.getenv("SUDO_UID")) 
sudo_gid = int(os.getenv("SUDO_GID")) 

# drop root privileges 
os.setresgid(sudo_gid, sudo_gid, -1) 
os.setresuid(sudo_uid, sudo_uid, -1) 

subprocess.call("mkdir /foo1", shell = True) # should fail 

# regain root privileges 
os.setresgid(0, 0, -1) 
os.setresuid(0, 0, -1) 

subprocess.call("mkdir /foo2", shell = True) # should succeed