2012-11-07 3 views
3

/tmp에 파일을 열 때 루트 권한을 삭제하는 문제가 있습니다. 내가 문제로 실행 내가 너무Python에서 루트 권한 삭제 파일 열기/사용 가능

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) 

os.stat 때

여기
open(filepath, 'wb') 

sudo에 명령 모든 것을 실행되지 않는 프로그램이 잘 작동하고 권한입니다 : 여기에 문제의 라인입니다 프로그램이 sudo 명령으로 실행될 때. 나는 다음과 같은

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

과 권한을 삭제하려고

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

그들을 다시 활성화 오류 메시지가 수익률

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) 

이상적으로 os.stat

IOError: [Errno 13] Permission denied: 

입니다 특정 기능을 실행하는 것을 좋아합니다. 마치 사용자가 루트 권한을 삭제하고 사용 가능하게 설정하여 sudo를 호출하지 않은 것처럼 말입니다.

+0

전체 코드를 게시하여 문제를 재현 할 수 있습니까? – del

+0

[Python에서 루트 권한 삭제 중]의 가능한 복제본 (https://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python) – jww

답변

2

당신이 뿌리 내린 프로세스에서 루트에서 변경해야 할 것입니다. 루트를 버리면 다시 되돌릴 수 없기 때문입니다. 당신은 이것을 위해 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

코드를 보내 주셔서 감사합니다. 위의 코드를 사용하여 사용 권한을 올바르게 삭제 했습니까? 이 경우 우리가 분기하기 때문에 루트를 다시 활성화해야합니까? – user1802143