第五章_进程 : 函数setuid、setgid

函数setuid、setgid

 #include <sys/types.h>
#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);

改变用户/组ID的规则

1、若进程具有超级用户权限,则setuid将实际用户ID、有效用户ID、保存的设置用户ID设置为uid
2、若进程没有超级用户权限,但uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid,不改变实际用户ID和保存的设置用户ID
3、若以上条件不满足,返回-1,errno设为EPERM

只有超级用户进程可以更改实际用户ID
实际用户ID是在用户登录时,由login程序设置的
login是一个超级用户进程,当它调用setuid时,会设置所有三个用户ID

仅当对程序文件设置了设置用户ID位时,exec才会设置有效用户ID。任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的设置用户ID

保存的设置用户ID是由exec复制有效用户ID而得来的

测试程序

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

void Show_Uid()
{
    printf("The UID is [%d] \n",getuid());
}
int main(void)
{
    int uid = 5000;
    Show_Uid();            //调用setuid之前查看UID

    if(setuid(uid) < 0)
        perror("set UID error");
    Show_Uid();            //设置UID之后
    
    if(setuid(2000) < 0)    //再次调用setuid设置UID
        perror("set UID error");     
    Show_Uid();            //设置UID之后    
    return 0;    
}

在这里插入图片描述
//因为上边将用户ID设置成5000,虽然以root权限运行,但是该进程的UID已经为5000,所以执行失败在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值