2014-03-12 5 views
9

sudoers 시스템을 사용하여 다른 범위의 사용자로 범위를 실행하는 sudo 컨텍스트 관리자를 구현할 수있는 방법이 있습니까?python : sudo 컨텍스트 관리자?

system('whoami') # same result as echo $USER 
with sudo(): 
    system('whoami') # root 

은 내가 sudo(8) 실행이 나를 여기에 도움이 될 것을 의심하지 않지만, 어쩌면 내가 바인딩 할 수있는 몇 가지 C 레벨의 인터페이스가있다?


동기 부여 : 나는 제외 거의 포트도 어떤 서브 프로세스없이 파이썬 전적 쉘 스크립트는 현재 system('sudo sh -c "echo %i > /dev/thatfile"' % value)로 할 수 있습니다. 내가 with sudo(), open('/dev/thatfile', 'w') as thatfile: thatfile.write(str(value)) 일 수 있으면 그것은 매우 우아 할 것이다.

+0

[fabric] (http://docs.fabfile.org/ko/1.8/api/core/operations.html?highlight=sudo#fabric.operations.sudo)에'sudo' 명령이 있습니다. 그것이 완성 된 방법을 검토하려면 원단 소스 코드를 검토하십시오. – J0HN

+0

@ J0HN : 간단히 살펴 봤습니다. 마치 ssh가 나중에 실행하는 명령에 "sudo"를 추가하는 것처럼 보입니다. 내 목표 (심지어 가능하다면)는 쉘없이 그렇게하는 것입니다. – bukzor

답변

1

나는 이것이 어떤 간단한 방법으로도 가능하지 않다고 생각합니다. sudo과 같이 사용 권한을 확대하는 프로그램은 파일 시스템 사용 권한 ("setuid"비트)에 플래그를 설정하여 운영 체제가이를 시작한 사용자가 아닌 다른 사용자로 실행하도록 지정해야합니다. 전체 파이썬 인터프리터가 setuid 루트가되기를 원하지 않는 한, 파이썬 코드의 일부 작은 부분에 대해 동일한 작업을 수행 할 직접적인 방법은 없습니다.

sudo 스타일 컨텍스트 관리자를 구현하는 것은 일반적인 Python 코드를 권한 실행으로 설정하는 것이 아니라 다양한 OS 호출 (예 : open 파일 만들기)을 일부 종류로 바꾸는 라이브러리 코드를 일시적으로 대체함으로써 가능할 수 있습니다 그것을 setuid 도우미 프로그램에 연결하는 프록시. 그러나 작동하도록하려면 많은 작업이 필요하며, 프로덕션 환경 어디서나 사용하기에 충분히 안전해야합니다.

system 호출에서 셸 스크립트를 사용하는 현재의 솔루션이 마음에 들지 않는다면 일반 사용자 권한으로 일반 파이썬 코드를 사용하여 파일을 작성하십시오. 그런 다음 chownsudo 호출을 사용하여 이동합니다 (필요한 경우 이동).