转自  http://blog.csdn.net/todd911/article/details/16370577

在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己用户ID或组ID,使得新ID具有合适的特权或访问权限。与此类似,当程序需要降低其特权或阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。可以用setuid函数设置实际用户ID和有效ID,与此类似,可以使用setgid函数设置实际组ID和有效组ID。

#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
//两个函数返回值:若成功则返回0,出错则返回-1。

POSIX.1包含了两个函数seteuid和setegid,它们类似于setuid和setgid,但是只更改有效用户ID和有效组ID。

#include <unistd.h>
int seteuid(uid_t uid);
int setegid(gid_t gid);
//两个函数返回值,若成功则返回0,出错则返回-1.

关于改变用户ID的规则如下:(用户ID所说明的一切都适用于组ID)

1.若进程具有超级用户特权,则setuid函数将实际用户ID,有效用户ID,以及保存的设置用户ID设置为uid。

2.若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid,不改变实际用户ID和保存的设置用户ID。

3.如果上面两个条件都不满足,则将errno设置为EPERM,并返回-1.

关于内核所维护的三个用户ID,还要注意下列几点:

1.只有超级用户进程可以更改实际用户ID,通常实际用户ID是在用户登录时,由login程序设置的,而且永远不会改变它。

2.仅当对程序文件设置了设置用户ID位后,exec函数才会设置有效用户ID。任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的设置用户ID。自然,不能将有效用户ID设置为任何随机值。

3.保存的设置用户ID是由exec复制有效用户ID而来的,如果设置了文件的设置用户ID,则在exec根据文件的用户ID设置了进程的有效用户ID后,将这个副本保存起来。

下表列出了改变这三个用户ID的不同方法。

下面通过一个例子说明保存的设置用户ID的用法。

man程序可能要执行许多其他命令,以处理包含需显示手册页的文件。为了防止被欺骗运行错误的命令或重写错误的文件,man命令不得不在两种权限之间切换:运行man命令用户的权限,以及拥有man可执行文件用户的权限。下面是其工作步骤:

1.man程序文件是由名为man的用户拥有的,并且其设置用户ID位已设置。当我们exec此程序时,关于用户ID得到:

实际用户ID=我们的用户ID

有效用户ID=man

保存的设置用户ID=man

2.man程序访问需要的配置文件和手册页,这些文件是由名为man的用户所拥有的,因为有效用户ID是man,所以

可以访问这些文件。

3.在man代表我们运行任一命令后,它调用setuid。因为我们不是超级用户进程,所以仅仅改变有效用户ID。此时:

实际用户ID=我们的用户ID

有效用户ID=我们的用户ID(已改变)

保存的设置用户ID=man

现在,man进程是以我们的用户ID作为其有效用户ID而运行的。它可以代表我们安全地执行任意过滤器程序。

4.当执行完过滤器操作后,man调用setuid(euid),其中euid是用户man的数值用户ID。因为setuid的参数等于

保存的设置用户ID,所以这种调用时允许的。现在得到:

实际用户ID=我们的用户ID

有效用户ID=man(已改变)

保存的设置用户ID=man

5.因为man程序的有效用户ID是man,所以现在它可对其文件进行操作。

//这个步骤好复杂啊...

更改用户id 和组id的更多相关文章

  1. 《UNIX环境高级编程》笔记--更改用户ID和组ID

    在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己 用户ID或组ID,使的新ID具有合适的特权或访问权限.与此类似,当程序需要降低其特 ...

  2. 进程控制之更改用户ID和组ID

    在UNIX系统中,特权(例如能改变当前日期的表示法以及访问控制(例如,能否读.写一特定文件))是基于用户ID和组ID的.当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户I ...

  3. 【转】linux 设置用户id 设置组id

    linux 设置用户id 设置组id   转自 linux 设置用户id 设置组id   最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个 ...

  4. 获取和设置用户id以及组id

    #include<unistd.h> uid_t getuid(void); uid_t geteuid(void);//获取有效用户id gid_t getgid(void); gid_ ...

  5. Linux id 命令 - 显示用户id和组id信息

    要登入一台计算机,我们需要一个用户名.用户名是一个可以被计算机识别的身份.基于此,计算机会对使用这个用户名的登陆的人应用一系列的规则.在Linux系统下,我们可以使用 id 命令. 什么是 id 命令 ...

  6. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  7. 文件模式设置用户ID/设置组ID/sticky bit_转

    S_ISUID  (04000)  set-user-ID (set process effective user ID on execve(2))S_ISGID  (02000)  set-grou ...

  8. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  9. 设置用户ID和设置组ID

    与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户I ...

随机推荐

  1. BZOJ3998 TJOI2015弦论(后缀自动机)

    先考虑相同子串视为一个.按SAM的拓扑序预处理出从每个节点开始能得到多少个本质不同子串(注意虽然一个节点对应多个子串,但到达该点时当前的子串显然是确定为其中一个的),然后按位贪心即可. 相同子串视为多 ...

  2. (十)springmvc之文件的处理

    一.同步上传文件 导入common-fileupload这个jar包. 配置     springmvc-servlet.xml <?xml version="1.0" en ...

  3. 通俗化理解Spring3 IoC的原理和主要组件

      ♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转( ...

  4. Java MergeSort

    Java MergeSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational ...

  5. MarkDown 语法大全查询

    目录 1. 斜体和粗体 2. 分级标题 3. 超链接 3.1. 行内式 3.2. 参考式 3.3. 自动链接 4. 锚点 5. 列表 5.1. 无序列表 5.2. 有序列表 5.3. 定义型列表 5. ...

  6. leetcode-174. Dungeon Game 地下城游戏

    一道关于骑士救公主故事的题目. 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过 ...

  7. springboot学习链接

    https://github.com/wuyouzhuguli/SpringAll

  8. bash功能——命令行编辑、内部命令 外部命令、命令补全 、命令历史、文件名通配符、命令别名

    命令行编辑: Ctrl + a : 跳转到当前编辑行首 Ctrl + e:跳转到当前编辑行尾 # mkdir /home/dira /home/diab 像这种命令,/home/dira 和 /hom ...

  9. Nginx系列1.2:nginx-rtmp流媒体服务器添加权限认证(推流权限和播放权限)

    用到的工具:OBS Studio(推流).nginx-rtmp流媒体服务器.VLC(拉取流播放) Nginx系列1:ubuntu16.04编译出适合自己的nginx服务器 Nginx系列1.1:ubu ...

  10. idou老师教你学Istio 27:解读Mixer Report流程

    1.概述 Mixer是Istio的核心组件,提供了遥测数据收集的功能,能够实时采集服务的请求状态等信息,以达到监控服务状态目的. 1.1 核心功能 •前置检查(Check):某服务接收并响应外部请求前 ...