1.实现一个功能,如果程序由root启动运行,将新建一个用户TEST,并将程序设置为TEST 用户权限运行
主要是通过getpwnam 和setuid函数,进行....
struct passwd *ptPasswd = NULL;
ptPasswd = getpwnam(NEW_USER_NAME);
if(NULL == ptPasswd)
{
return FALSE;
}
if(0 != setuid(ptPasswd->pw_uid))
实现方式看似简单,其实用到了用户知识,共有三个uid,
#ps -ef 第一列显示的是UID ,即程序被该 UID 所拥有
扩展学习:
三个UID,即用户ID, 实际生效ID,保存的设置用户ID
在讨论这个setuid函数之前,我们首先要了解三个ID :
内核为每个进程维护的三个UID值。这三个UID分别是 实际用户ID(real uid)、有效用户ID(effective uid)、保存的设置用户ID(saved set-user-ID)。
首先说这个实际用户ID,就是我们当前以哪个用户登录了,我们运行的程序的实际用户ID就是这个用户的ID。有效用户ID就是当前进程是以哪个用户ID来运行的,一般情况下是实际用户ID,如果可执行文件具有了SUID权限,那么它的有效用户ID就是可执行文件的拥有者。保存的设置用户ID就是有效用户ID的一个副本,与SUID权限有关。
关于那个SUID,最经典的例子莫过于passwd命令。passwd这个可执行文件的所有者是root,但是其他用户对于它也有执行权限,并且它自身具有SUID权限。那么当其他用户来执行passwd这个可执行文件的时候,产生的进程的就是以root用户的ID来运行的
setuid(tetid);
1.如果进程有超级用户特权,那么把三个ID都设置为testID
2,如果没有超级特权,那么tetid等于实际用户ID 或者保存设置的ID ,那么把 有效ID设置为 tetID,
若不满足1,2 ,报错。
获取三个Uid函数getresuid
其他getpwnam,getpwuid 通过name或者uid获取到信息 ...
涉及到suid权限,如果运行程序有suid权限,那么 有效uid就设置为可执行文件的所有者。