民间, 这是我想要做的:我的脚本将以root身份运行,我希望以不同的用户执行各种命令(比如ls,rm,touch等)。
我遇到的问题是使用preexec_fn=os.setuid(userid))
也是设置父进程的用户ID。建议好吗? preexec_fn
是否有错误的方法来实现这一目标?还需要注意的是,这需要采用扭曲的方式(我可能不会这样)。 getProcessOutputAndValue
是可行的吗?如果是这样,怎么做这样的事情?
print 'uid is %s' % os.getuid()
cmdstr = ['ls']
process = subprocess.Popen(cmdstr,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, preexec_fn=os.setuid(10033))
print 'uid of parent after child startup is %s' % os.getuid()
process.wait()
print 'uid of parent after child finished is %s' % os.getuid()
输出:
uid is 0
uid of parent after child startup is 10033
uid of parent after child finished is 10033
答案 0 :(得分:4)
您的问题是当您只是尝试将回调传递给Popen时,您无意中调用了preexec_fn。
请改为尝试:
def my_preexec_fn():
os.setuid(10033)
process = subprocess.Popen(cmdstr,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, preexec_fn=my_preexec_fn)
答案 1 :(得分:1)
rlibby的回答是正确和充分的,但是我想添加以下选项来创建回调:
import functools as ft
my_preexec_fn= ft.partial(os.setuid, 10033)