在Python脚本中以不同用户执行'ls'命令

3 投票
2 回答
3843 浏览
提问于 2025-04-16 15:22

大家好,

我现在想做的是:我的脚本会以超级用户(root)的身份运行,我希望能够以不同用户的身份执行一些命令,比如 ls、rm、touch 等等。

我遇到的问题是,使用 preexec_fn=os.setuid(userid) 这个方法时,会把父进程的用户ID也设置成我想要的用户ID。请问有什么建议吗?难道 preexec_fn 不是实现这个目标的正确方法吗?另外,我还需要用到 twisted 这个框架(我可能还不太懂)。那么 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 个回答

1

rlibby的回答是正确的,也很合适,不过我想补充一个创建回调函数的选项:

import functools as ft
my_preexec_fn= ft.partial(os.setuid, 10033)
5

你的问题是,你在只想给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)

撰写回答