用户ID的基本概念

在Unix系统中,很多操作涉及到权限问题,这些权限涉及到用户ID和组ID的概念。
    组ID和用户ID的原理和相关内容是类似的。下面介绍用户ID。
    我们常见见到三种关于用户ID的概念。
    实际用户ID:real user ID      (RUID)
    有效用户ID:effective user ID    (EUID)
    设置用户ID:saved set-user ID    (SUID)
    这三个ID实际上都是针对进程而言的。

实际用户ID
        标识进程的执行者。可以看做是我们登录的ID,由login程序在登录时进行设置,一般不改变。只有超级用户可以改变RUID
有效用户ID
        标识进程执行时文件的访问权限,一般情况下与实际用户ID相同,由exec函数进行设置,只有在set-user ID被设置时才可能发生变化。也有不一样的情况,比如我们修改自己密码时需要访问passwd文件,这是需要改变有效用户ID为root才能访问。
设置用户ID
        设置用户ID其实是一种机制,有时我们访问一个文件的时候,需要获取这个文件的所有者的权限。如果该文件的设置用户ID位已经被设置,那么程序执行时就可以吧EUID设置为文件所有者的ID,然后save set-user ID用于保存EUID的一个副本。

    
    下面通过man命令来说明三种用户ID
首先我们执行man,因为man程序文件归用户man所有,且SUID位被设置,因此用户id如下:
  1. RUID 我们的id(后面用windeal表示)
  2. EUID man 运行man时通过setuid(getuid())设置
  3. SUID man(从EUID拷贝来)
OK,先在我们开始执行man程序了,接下来我们要做的第一件事就是降低执行的权限,将EUID改回原来权限较小的windeal,而不是一直使用man这个用户id:
  1. RUID windeal(不变)
  2. EUID windeal
  3. SUID man(不变)
因为man程序执行过程中可能需要访问一些手册、配置文件,而这些文件又需要man用户权限。因此,在执行man的过程中,每当需要访问这些文件的时候,我们又把EUID改为man。
  1. RUID windeal(不变)
  2. EUID man
  3. SUID man(不变)
也就是说,在man执行中,EUID会一直切换,需要man权限时,就把EUID改为man,否则就使用windeal一直执行。

关于用户id的几组函数

setuid和setgid
  1. #include <unistd.h>
  2. int setuid(uid_t uid);
  3. int setgid(gid_t gid);
  4. Both return: 0 if OK,−1 on error
        如果进程用户具有超级用户权限,则
setuid(
uid)将RUID、EUID、SUID全部设为uid。
        如果进程用户没有超级用户权限,且uid等于RUID或者SUID,则
setuid(uid_t
uid)  
将EUID设置为uid
        如果前面两点都不满足,则errno设置为EPERM,返回-1

setreuid和setregid
  1. #include <unistd.h>
  2. int setreuid(uid_t ruid,uid_t euid);
  3. int setregid(gid_t rgid,gid_t egid);
  4. Both return: 0 if OK,−1 on error
                设置调用进程(calling process)的RUID和EUID。 参数ruid和euid任何一个如果设置为-1,则表示该参数对应的RUID或EUID不改变。
        非特权进程只能将EUID设置为 RUID、EUID或者SUID
        非特权进程只能将RUID设置为RUID或EUID

        如果RUID被设置,或者EUID被设置为跟以前的RUID不等的值,则SUID会被设置为新的EUID

seteuid和setegid
  1. #include <unistd.h>
  2. int seteuid(uid_tuid);
  3. int setegid(gid_tgid);
  4. Both return: 0 if OK,−1 on error
这两个函数类似于setuid和setgid,只不过前者只对EUID进行设置。












    

APUE学习笔记——8.11 实际用户ID、有效用户ID、设置用户ID的更多相关文章

  1. APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号

    如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...

  2. SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序

    SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...

  3. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  4. Flutter学习笔记(11)--文本组件、图标及按钮组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...

  5. javaSE学习笔记(11)--- Map

    javaSE学习笔记(11)--- Map 1.Map集合 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Jav ...

  6. ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改

    ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...

  7. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  8. Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6)

    Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6) 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配置DNS ...

  9. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

随机推荐

  1. rootpw密码生成方法/c-exit

    linux kickstart文件里rootpw密码可以使用明文,也可以使用加密过的值,这里主要介绍下三种加密方法:md5.sha256.sha512 使用明文的方法 rootpw "pas ...

  2. Python爬虫学习笔记之爬虫基础库

    知识预览 beautifulsoup的简单使用 beautifulsoup的遍历文档树 beautifulsoup的搜索文档树 beautifulsoup的css选择器 回到顶部 beautifuls ...

  3. logstash5.x安装及简单运用

    Logstash requires Java 8. Java 9 is not supported. 1.检测是否安装了java环境 [root@node3 ~]# java -version jav ...

  4. 通过paramiko模块在远程主机上执行命令

    安装paramiko模块 /usr/local/python36/bin/pip3 install paramiko 1.获取cpu使用率 #!/usr/bin/python #coding=utf8 ...

  5. 20145310 《Java程序设计》第4周学习总结

    20145310 <Java程序设计>第4周学习总结 教材学习内容总结 本周主要进行第五章和第六章的学习. 第六章 继承与多态 子类(Inherit)继承父类,避免重复的行为定义,不过并非 ...

  6. Linux 软件看门狗 watchdog 喂狗

    Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog程序.内核 watchdog 模块通过 /dev/ ...

  7. 图片上传oss--先拿server端签名再上传oss,返回id值

    目前项目oss阿里云存储图片,图片上传主要步骤是:前端从服务端拿到签名signature,再上传到oss上busket里,上传成功返回图片id (imgId),最后再给server端: 注:官网上有个 ...

  8. 彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    以前写程序一直没有注意hashCode的作用,一般都是覆盖了equals,缺没有覆盖hashCode,现在发现这是埋下了很多潜在的Bug!今天就来说一说hashCode和equals的作用. 先来试想 ...

  9. Sqoop相关

    # sqoop安装 1. 常规步骤(安装在一台节点上即可) 由于sqoop2配置相对比较麻烦,此次使用的是sqoop1进行演示. 上传sqoop-1.4.4.bin_hadoop-2.0.4-alph ...

  10. ACM输入函数测试 - scanf cin 优化的输入

    2017-08-27 10:26:19 writer:pprp 进行测试如下四种输入方式: 1.scanf 2.cin 3.用了ios::sync_with_stdio(false);的cin 4.自 ...