2013-10-25 1 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 

Если ЦМД «сон 60», то скрипт Призывает спать как пользователь:

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

Однако, если ЦМД 'эхо $ USER', то Outout является "корнем". Есть ли кто-то, что мне нужно сделать, чтобы получить env пользователя, если я создаю подпроцесс как более простой пользователь?

ответ

1

Вы не очень есть проблема с подпроцессом здесь. Подпроцесс получает переданную среду из вашей текущей среды, поэтому, когда вы «echo $ USER», она сообщает пользователю о текущей среде.

Посмотрите, что происходит, когда вы меняете команду whoami, которая на самом деле проверяет ваш UID:

Мой питон оболочка работает как корень:

>>> 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 вызов. См. Ключевое слово env, прошедшее с помощью справки (подпроцесс.Popen):

__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'"