在Python脚本中以不同用户执行'ls'命令
大家好,
我现在想做的是:我的脚本会以超级用户(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)