在Python中以指定UID执行Shell命令
我需要一种方法,可以以不同的用户身份执行os.system()模块。它的行为需要和下面的BASH代码类似(注意,这些并不是我实际执行的命令):
su user1
ls ~
mv file1
su user2
ls ~
mv file1
目标平台是GNU Linux通用版。
当然,我可以直接把这些命令传给os.system模块,但问题是怎么传递密码呢?我可以以root用户运行脚本,但这样做不太安全,也不够规范。
我希望能做到这一点,而不需要明文显示任何密码。
4 个回答
也许用sudo可以帮到你,否则你必须是管理员才能执行os.setuid这个命令。
另外,如果你想玩得开心一点,可以用pexpect来做一些事情,像这样,你可以在这个基础上改进一下。
p = pexpect.spawn("su guest")
p.logfile = sys.stdout
p.expect('Password:')
p.sendline("guest")
我觉得这个问题不简单:在命令行中,每个命令都是在自己的进程中运行的,每个进程都有自己的身份标识(ID)。但是在Python中,所有的东西都会使用Python解释器进程的用户身份(UID),当然,前提是你没有使用子进程模块来启动子进程。我不知道有没有办法改变一个进程的用户身份——我也不确定这是否可能——即使可以,你至少也需要管理员权限。
你到底想做什么呢?这听起来不太像是为了管理员目的而做的事情。一般来说,管理员脚本都是在特权用户下运行的——因为除了用户2,没人知道用户2的密码(理论上)。成为root用户意味着普通用户在使用su命令切换用户时,总是可以不输入密码。
你要找的函数叫做 os.seteuid
。不过我得告诉你,可能你无法避免以管理员身份执行这个脚本,但我觉得你可以使用 capabilities(7)
这个框架来“限制”执行的权限,这样它就可以切换用户,但不能做超级用户能做的其他事情。
另外,你也许可以通过 PAM 来实现这个功能。但总的来说,没有什么“简单”的方法可以做到这一点,David Cournapeau 说得没错,通常管理员脚本都是以特权身份运行的。