在python脚本中执行'ls'命令作为不同的用户

时间:2011-04-09 01:04:18

标签: python callback

民间, 这是我想要做的:我的脚本将以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

2 个答案:

答案 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)