os.setuid不会改变当前用户

我想改变脚本执行的当前用户。 我做到了

import os newuid = pwd.getpwnam('newuser').pw_uid os.setuid(newuid) print('User :' + getpass.getuser()); 

我仍然得到root 。 有没有比这更好的方法? 我希望切换用户一次,然后继续在脚本中使用该新用户执行命令的其余部分。

getpass.getuser()不使用getuid()geteuid()来获取当前用户。

http://docs.python.org/3/library/getpass.html#getpass.getuser

该函数依次检查环境变量LOGNAME,USER,LNAME和USERNAME,并返回第一个设置为非空字符串的值。 如果没有设置,则在支持pwd模块的系统上返回来自密码数据库的登录名,否则会引发异常。

在尝试模块ossubprocessgetpass ,我意识到问题不在于用户是否被设置。 用户得到设置或使用os.setuid更改,但是,从模块获取用户名,如os.getlogin()getpass.getuser() ,实际上没有得到正确的用户名。 如果您使用os.system()os.system()运行shell命令whoamiid ,您将获得更改的用户。 这些对我来说都是一些困惑的输出。 下面是显示所有这些怪异行为的脚本。

 import os import subprocess import pwd import getpass #os.chdir("/tmp") #uid = pwd.getpwnam('newuser').pw_uid os.setuid(500) # newuser's id found from shell cmd line print os.getuid() p = subprocess.Popen(['id'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # print os.system('useradd newuser1') # Try this commenting, it will not create, and then try commenting above line of setuid. ie it will become root, and then see the change. # print os.getcwd() print out,err p = subprocess.Popen(['whoami'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() print out,err print getpass.getuser() print os.getlogin() print os.system('whoami')