17.3.6 检测和改变进程所有者
os提供的下一组函数用于确定和改变进程所有者ID。守护进程或一些特殊系统程序(需要改变权限级别而不是作为root运行)的作者最常使用这些函数。
下面的例子显示了一个进程的有效用户和组信息,然后改变这些有效值。这类似于系统自引导期间一个守护进程作为root启动时可能要做的工作,比如降低权限等级,以及作为一个不同的用户运行。
说明:运行这个例子之前,要改变TEST_GID和TEST_UID值,从而与系统上定义的一个真实用户一致。
import os
TEST_GID = 502
TEST_UID = 502
def show_user_info():
print('User (actual/effective) : {} / {}'.format(
os.getuid(),os.geteuid()))
print('Group (actual/effective) : {} / {}'.format(
os.getgid(),os.getegid()))
print('Actual Groups :',os.getgroups())
print('BEFORE CHANGE:')
show_user_info()
print()
try:
os.setegid(TEST_GID)
except OSError:
print('ERROR: Could not change effective group. '
'Rerun as root.')
else:
print('CHANGE GROUP:')
show_user_info()
print()
try:
os.seteuid(TEST_UID)
except OSError:
print('ERROR: Could not change effective user. '
'Rerun as root.')
else:
print('CHANGE USER:')
show_user_info()
print()
这个代码会生成以下输出:
这些值不会改变,因为只要不作为root运行,进程就不能改变其有效的所有者值。试图将有效用户ID或组ID设置为非当前用户的其他值时,会导致一个OSError。使用sudo运行同样的脚本,使它启动时有root权限,结果则会完全不同。