在我的Python腳本中,我執行一些需要root權限的操作。我還創建並寫入文件,我不想由root用戶獨佔,而是由正在運行腳本的用戶擁有。在Python中刪除某些操作的root權限
通常,我使用sudo
運行我的腳本。有沒有辦法做到上述?
在我的Python腳本中,我執行一些需要root權限的操作。我還創建並寫入文件,我不想由root用戶獨佔,而是由正在運行腳本的用戶擁有。在Python中刪除某些操作的root權限
通常,我使用sudo
運行我的腳本。有沒有辦法做到上述?
可以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')
這將創建file1
和file3
爲根,但file2
與UID 501
如果要確定哪些用戶被呼叫用戶您的腳本sudo
設置了兩個環境變量:
SUDO_USER
SUDO_UID
分別用戶名稱和呼叫sudo
的用戶的uid。所以,你可以使用int(os.environ['SUDO_UID'])
與os.seteuid()
使用。
http://linux.die.net/man/8/sudo報價:
的真實和有效的UID和GID設置爲匹配目標用戶的
所以,你只需要知道使用哪個用戶的選擇是,無論是從配置讀取目標用戶文件或cmdline選項,或某種方式的啓發式猜測。
一個好主意就是所謂的權利流失:從root權限開始,然後執行你爲他們定義的權限。然後成爲一個權限較低的用戶。
你會使用os模塊爲: http://docs.python.org/2/library/os.html#os.setuid
我發現使用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
如果你使用'sudo'運行,你可以隨時'後您chown'到'__FILE__'的所有者大功告成 – slezica
@uʍopǝpısdn是的......但這樣做這樣的事情很快就變得活潑,如果你不小心。 – thejh
我沒有明白,對不起。創建所有文件的根源('sudo'的後果)。我如何檢索運行腳本的用戶的用戶ID? –