2013-10-25 3 views
1

다른 사용자로 파이썬 하위 프로세스를 사용하지만, 다른 사용자로 서브 프로세스를 실행할 때 : 잘못된 환경 내가 루트로 실행이 간단한 파이썬 스크립트가

#!/usr/bin/env python2 
import subprocess 
import os 

def demote(user_uid): 
    def result(): 
     os.setuid(user_uid) 
    return result 

cmd = "echo $USER" 
proc = subprocess.Popen(cmd, preexec_fn=demote(1000), stdout=subprocess.PIPE, shell=True) 
output = proc.communicate()[0] 

print output 

cmd를 다음 "잠 60"스크립트 급부상 경우

# ps -ef | grep sleep 
dave 17812 17811 0 17:05 pts/5 00:00:00 /usr/bin/sleep 60 

그러나 cmd가 'echo $ USER'이면 outout은 'root'입니다. 하위 사용자를 노터 사용자로 생성하면 사용자의 환경을 가져와야 할 사람이 있습니까?

답변

1

을 위해 당신은 정말하지 않습니다 여기에 하위 프로세스에 문제가 있습니다. 서브 프로세스는 현재 환경에서 환경을 전달하므로, "echo $ USER"는 현재 환경에서 사용자를보고합니다.

내 파이썬 쉘 루트로 실행 : 당신은 실제로 당신의 UID 확인 whoami에 명령을 변경하면 어떻게되는지

>>> print os.getuid() 
0 

그러나 실행되고 명령을 변경 올바른 새로운 출력 사용자 :

>>> cmd = "whoami" 
>>> proc = subprocess.Popen(cmd, preexec_fn=demote(1000), stdout=subprocess.PIPE, shell=True) 
>>> output = proc.communicate()[0] 
>>> print output 
voodoonofx 

정말 환경을 수정하여 해당 사용자가되도록하려면 Popen에 새 사전을 전달할 수 있습니다. 전화. 도움말 (subprocess.Popen)과 함께 전달 된 env 키워드를 참조하십시오.

__init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) 
     Create new Popen instance. 
0

변경하는 명령을 실행하기 전에 사용자가, 그 도움이 될 :

su otheruser # this will prompt you to enter the 'otheruser' password. 
0

하나의 옵션이 전체 로그인 쉘을 실행하는 것입니다 ... 예를

cmd = "/bin/bash -l -c 'echo $USER'"