我想改变脚本执行的当前用户。 我做到了
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模块的系统上返回来自密码数据库的登录名,否则会引发异常。
在尝试模块os
, subprocess
, getpass
,我意识到问题不在于用户是否被设置。 用户得到设置或使用os.setuid
更改,但是,从模块获取用户名,如os.getlogin()
, getpass.getuser()
,实际上没有得到正确的用户名。 如果您使用os.system()
或os.system()
运行shell命令whoami
或id
,您将获得更改的用户。 这些对我来说都是一些困惑的输出。 下面是显示所有这些怪异行为的脚本。
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')