2012-11-07 71 views
3

我正在運行一個關於在/ tmp中打開文件時刪除root權限的問題。這是有問題的行:在Python中刪除/啓用Root權限打開文件

open(filepath, 'wb') 

當程序不與sudo命令運行一切工作正常,這裏的權限,當我這樣os.stat

posix.stat_result(st_mode=17407, st_ino=261652, st_dev=64512L, st_nlink=206, st_uid=1000, st_gid=1000, st_size=12288, st_atime=1352314677, st_mtime=1352316340, st_ctime=1352316340) 

我碰到一個問題當程序使用sudo命令運行時。我嘗試用以下

os.setegid(int(os.getenv("SUDO_GID"))) 
os.seteuid(int(os.getenv("SUDO_UID"))) 

放棄特權與

os.seteuid(0) 
os.setegid(0) 

重新啓用它們的錯誤消息是

IOError: [Errno 13] Permission denied: 

os.stat產量

posix.stat_result(st_mode=17407, st_ino=261652, st_dev=64512L, st_nlink=204, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1352314677, st_mtime=1352316329, st_ctime=1352316329) 

理想我'喜歡運行一個特定的功能就好像用戶從未通過相應地刪除和啓用root權限來調用sudo一樣。

+0

可以發佈完整的代碼來重現問題嗎? – del

+0

[在Python中刪除root權限]可能的副本(https://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python) – jww

回答

2

你可能需要在你以某種方式產生的進程中從root進行更改,因爲如果你刪除root,你將無法再重新獲得它。你可以嘗試使用os.fork()。

import os 


def drop_permissions(): 
    os.setegid(int(os.getenv("SUDO_GID"))) 
    os.seteuid(int(os.getenv("SUDO_UID"))) 


def call_without_permissions(func, *args, **kw): 
    in_parent = os.fork() 
    if not in_parent: 
     drop_permissions() 
     func(*args, **kw) 
     os._exit(0) 
    else: 
     os.waitpid(0) 
+0

您介意將示例代碼鏈接到演示如何執行此操作的示例代碼? – user1802143

+0

現在開始工作。然而,它不會真正運行,你必須自己實現一些東西,比如你已經準備好的現有用戶更換器。 – pydsigner

+0

感謝您的代碼。我是否正確使用我的上述代碼刪除/啓用權限?在這種情況下,我甚至需要重新啓用root,因爲我們是分叉的? – user1802143