我想更改当前用户的脚本执行。我这样做了
import os
newuid = pwd.getpwnam('newuser').pw_uid
os.setuid(newuid)
print('User :' + getpass.getuser());
我仍然得到root
。还有比这更好的方法吗?我希望切换用户一次,然后继续使用该新用户在脚本中执行其余的命令。
答案 0 :(得分:5)
getpass.getuser()
不会使用getuid()
或geteuid()
来获取当前用户。
http://docs.python.org/3/library/getpass.html#getpass.getuser
此函数按顺序检查环境变量LOGNAME,USER,LNAME和USERNAME,并返回设置为非空字符串的第一个值。如果未设置,则在支持pwd模块的系统上返回密码数据库的登录名,否则将引发异常。
答案 1 :(得分:1)
尝试模块os
,subprocess
,getpass
后,我意识到问题不在于用户是否已设置。使用os.setuid
设置或更改用户,但是,模块中获取用户名os.getlogin()
,getpass.getuser()
的方法实际上无法正确获取用户名。如果您使用whoami
或id
运行shell命令subprocess.Popen()
或os.system()
,您将获得更改后的用户。对我来说这些都是一些困惑的输出。下面是显示所有这些奇怪行为的脚本。
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. i.e. 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')