8

我想更改当前用户以执行脚本。我做了这个

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

我还在root。还有比这更好的方法吗?我想切换用户一次,然后使用该新用户继续执行脚本中的其余命令。

4

2 回答 2

5

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

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

此函数按顺序检查环境变量 LOGNAME、USER、LNAME 和 USERNAME,并返回第一个设置为非空字符串的值。如果未设置,则在支持 pwd 模块的系统上返回密码数据库中的登录名,否则将引发异常。

于 2013-09-19T14:05:59.950 回答
1

在尝试了 modules os, subprocess,之后getpass,我意识到问题不在于是否设置了用户。使用 设置或更改用户os.setuid,但是,从模块中获取用户名的方法,例如os.getlogin()getpass.getuser()实际上并没有正确获取用户名。如果您运行 shell 命令whoamiid使用subprocess.Popen()or 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')
于 2013-12-05T13:57:36.737 回答