模拟Linux修改实际、有效和保存设置标识

就是模拟setuid seteuid setreuid setresuid,感觉代码比书上大段的文字好记,就写成代码形式了。

// setuid.cc: 模拟<unistd.h>中的设置用户ID的方法的作用
#include <stdio.h>
#include <errno.h>

int real = 0;          // 实际用户ID
int effective = 0;     // 有效用户ID
int saved = 0;         // 保存的设置用户ID

void showid();  // 打印所有ID

inline bool hasPrivilege() { return effective == 0; }
#define EINVAL_RETURN { errno = EINVAL; return -1; }
#define EPERM_RETURN { errno = EPERM; return -1; }

int setuid(int uid)  // 修改所有用户ID
{
    if (uid < 0)
        EINVAL_RETURN;
    if (!hasPrivilege() && uid != real && uid != saved)
        EPERM_RETURN;
    if (hasPrivilege())
        real = effective = saved = uid;
    else
        effective = uid;
    return 0;
}

int seteuid(int euid)  // 修改有效用户ID
{
    if (euid < 0)
        EINVAL_RETURN;
    if (!hasPrivilege() && euid != real && euid != saved)
        EPERM_RETURN;
    effective = euid;
    return 0;
}

int setreuid(int ruid, int euid)  // 修改实际/有效用户ID
{
    if (ruid < -1 || euid < -1)
        EINVAL_RETURN;
    if (!hasPrivilege())
    {
        if (ruid != -1 && ruid != real && ruid != effective)
            EPERM_RETURN;
        if (euid != -1 && euid != real && euid != effective && euid != saved)
            EPERM_RETURN;
    }
    int old_real = real;
    real = (ruid != -1) ? ruid : real;
    effective = (euid != -1) ? euid : effective;
    if (effective != old_real)
        saved = effective;
    return 0;
}

// 非SUSv3规范, 其他UNIX实现对其也鲜有支持
int setresuid(int ruid, int euid, int suid)  // 修改实际/有效/保存用户ID
{
    if (ruid < -1 || euid < -1 || suid < -1)
        EINVAL_RETURN;
    if (!hasPrivilege())
    {
        if (ruid != -1 && ruid != real && ruid != effective && ruid != saved)
            EPERM_RETURN;
        if (euid != -1 && euid != real && euid != effective && euid != saved)
            EPERM_RETURN;
        if (suid != -1 && suid != real && suid != effective && suid != saved)
            EPERM_RETURN;
    }
    real = (ruid != -1) ? ruid : real;
    effective = (euid != -1) ? euid : effective;
    saved = (suid != -1) ? suid : saved;
    return 0;
}

int main()
{
    real = 1000;
    // 下面4句只能执行其中1句
//    setuid(2000);
    setreuid(-1, 2000);
//    seteuid(2000);
//    setresuid(-1, 2000, 3000);

    showid();
    return 0;
}

void showid()
{
    printf("实际用户ID:       %4d\n", real);
    printf("有效用户ID:       %4d\n", effective);
    printf("保存的设置用户ID: %4d\n", saved);
}

main函数是TLPI第9章习题第1道的运行结果,然后模拟了一遍功能,后面几道也很简单就能做出来了。以后忘记的话看遍代码就能很快记起来了。

时间: 2024-10-22 16:37:53

模拟Linux修改实际、有效和保存设置标识的相关文章

以Qemu模拟Linux,学习Linux内核

文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html维护日志:2013-02-21 建立文档(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明.文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖

模拟linux 双网卡双ip,实现multipath多路径连接存储

模拟linux 双网卡双ip,实现multipath多路径连接存储 系统(Centos6.5:oracle-1): eth0:192.168.21.23/24 eth1:172.16.112.17/24 存储Ip:  192.168.21.230 首先要配置iscsi存储,再其次一下操作,我这里配置了两个ISCIS存储 网卡路由配置 由于只能有一个网关,所以要添加静态路由实现双网卡通信 1.编辑网卡eth0,eth1 设置好配置文件,不添加默认网关 # vi /etc/sysconfig/net

Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)

目录 1 问题说明 2 修改max open files 3 修改max user processes 4 附录: ulimit命令说明 1 问题说明 Linux 系统默认的max open files = 1024, 在大内存服务器中, 如果运行负载比较大的程序, 很容易发生error: too many open files, 特别是提供大量静态文件访问的Web服务器.缓存服务器中这种错误更加常见. open files表示系统级别的能够打开的文件句柄的数量, 是系统级别的安全策略: 限制所

Linux修改Shell命令提示符及颜色

Linux修改Shell命令提示符及颜色 1. Linux登录过程中加载配置文件顺序: /etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~/.bashrc → [/etc/bashrc] 可查看默认的~/.bashrc文件如下: [root@~/wade/codeReview/redis-2.8.17] cat ~/.bashrc # .bashrc   # User specific aliases and functions  

linux修改文件和目录权限chmod

1. 文件权限简介 linux文件权限有9个,三组表示,owner, group, others,每组又包含r,w, x三种状态. 2. 根据数字修改权限 r, w, x三种权限通过数字来代表: r: 4 w: 2 x: 1 每组的权限为上面三个相加. 比如权限为; [-rwxrwx---] owner: rwx = 4 + 2 + 1 = 7 group: rwx = 4 + 2 +1 = 7 others: --- = 0 + 0 + 0 = 0 对应的权限为 770 chmod 770 t

转: 深入理解Linux修改hostname

from: http://www.cnblogs.com/kerrycode/p/3595724.html 写的相当详细!!! 深入理解Linux修改hostname 2014-03-12 10:17 by 潇湘隐者, 81950 阅读, 19 评论, 收藏, 编辑 当我觉得对Linux系统下修改hostname已经非常熟悉的时候,今天碰到了几个个问题,这几个问题给我好好上了一课,很多知识点,当你觉得你已经掌握的时候,其实你了解的还只是皮毛.技术活,切勿浅尝则止! 实验环境:Red Hat En

Linux修改时间的方法

Linux修改时间的方法 在命令行输入: date 显示当前时间 Fri Aug  3 14:15:16 CST 2007 date '+%x %X' 显示当前时间 2009年08月03日 14时15分00秒 date -s 按字符串方式修改时间 可以只修改日期,不修改时间,输入: date -s 2007-08-03 只修改时间,输入:date -s 14:15:00 同时修改日期时间,注意要加双引号,日期与时间之间有一空格,输入:date -s "2007-08-03 14:15:00&qu

Linux修改系统主机名

一.查看主机名   [[email protected] ~]# uname -n xqzt [[email protected] ~]# hostname xqzt 二.修改hostname的四种方式? 1: hostname xqzt                                                             --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改 2: echo xqzt > /proc/sys/kernel/host

Python:模拟linux命令cat

模拟linux的cat命令,打印从命令行输入的文件名 #!/usr/bin/python #Filename:cat.py helpString = '''This program prints files to the standard output. Any number of files can be specified. Options include: --version : Prints the version number --help : Display this help'''