其中setresuid()具有最清晰的语法:

setresuid()被执行的条件有:

①当前进程的euid是root

②三个参数,每一个等于原来某个id中的一个

如果满足以上条件的任意一个,setresuid()都可以正常调用,并执行,将

进程的ID设置成对应的ID。

例子:

如果ruid=100,euid=0,suid=300

则setresuid(200,300,100)可以执行,因为原来的euid=0.

如果ruid=100,euid=300,suid=200

则setresuid(200,300,100)也可以执行,因为这三个新的id都是原来id中的某一个。

但是setresuid(100,200,400)就不能执行,因为400不等于原来三个id中的任意一个。

setresuid()有个性质,英文名称是all-or-nothing effect,意思是,如果setresuid()

对某一个ID设置成功了,其他的失败了,比如只改变了ruid,suid和euid都改失败了

那么程序会将ruid改回原来的值,即保证要么三个ID都能成功修改,要么三个都没能修改成功。

PS:FreeBSD和Linux支持setresuid,Solaris不支持setresuid,但有自己的实现方式。

seteuid()也有较清晰的语法:

无论什么情况,它只改变进程euid,而不改变ruid和suid。

如果原来的euid==0,则新的euid随意设,都可以成功改变。

如果原来的euid!=0,不同的系统的处理方式是不一样的:

-Solaris和Linux只允许新的euid等于原来三个id中的任意一个;

-但是FreeBSD只允许新的euid等于ruid和suid中的一个;

貌似FreeBSD这个限制是多余的,因为新的euid==原来的euid的时候应该是可以的,但是它会报错,不允许。

setreuid()有点小复杂:

它会修改ruid和euid,也某些情况下,也会修改suid。

而且不同的系统对setreuid也有不同的处理方式:

-在Solaris和Linux中,setreuid(geteuid(),getuid())可以实现ruid和euid的交换

-FreeBSD则会失败;

setuid()

如果原来的euid==0,则该函数将会设置所有的id都等于新的id。

如果原来的三个id为:ruid=300,euid=0,suid=100

则setuid(200)执行以后,ruid=200,euid=200,suid=200

如果原来的euid!=0,但是新的id等于原来ruid和suid中的一个,那么也是可以执行的。否则就不能执行。

比如原来的三个id为:ruid=100,euid=200,suid=300

则setuid(300)可以执行,执行结束以后ruid=100,euid=300,suid=300(也就是说只改变了euid)。

setuid(400)就不能执行。

不同的系统有不同的处理方式:

-Linux和Solaris:如果euid不等于0,那么新的id必须等于ruid或者suid中的一个(就是我们上面说的);

-FreeBSD待定,还没搞清楚;

setuid()的行为不仅取决于系统,还取决于进程的优先级:

-Linux和Solaris:如果euid==0,那么将三个id都设置为新的id;否则,只设置euid;

-FreeBSD:不管euid值,如果执行成功,直接设置所有的id都为新的id;

linux/unix下setuid/seteuid/setreuid/setresuid的更多相关文章

  1. 10分钟 教你学会Linux/Unix下的vi文本编辑器

    10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...

  2. 【Linux】linux/unix下telnet提示Escape character is '^]'的意义

    在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...

  3. linux/unix下telnet提示Escape character is '^]'的意义

    在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...

  4. Linux/UNIX 下 “command not found” 原因分析及解决

    在使用 Linux/UNIX 时,会经常遇到 "command not found" 的错误,就如提示的信息,Linux /UNIX 没有找到该命令.原因无外乎你命令拼写错误或 L ...

  5. Linux/Unix下设置定时任务

    Unix系统提供了cron和at命令,使系统和用户可以定时运行一定的程序,而不需手工启动. 使用cron用于周期性的执行一个命令,为了使用它,必须编辑crontab文件.系统缺省的/etc/cront ...

  6. 教你学会Linux/Unix下的vi文本编辑器

    vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结. 首先,记住vi编辑器的两个模式:1.命令模式 2.编辑模式. 在一个UNIX/Linux的s ...

  7. linux/Unix下的vim/vi指令的使用方法

    概述 以下这篇文章介绍的是关于vim的使用方法,由于我本身对linux没有太多的研究,写下的这篇文章纯属是在实际中经常使用vim指令,想通过这篇文章记录下来,方便以后使用时查找方便.个人认为,对于普通 ...

  8. Mac下SVN服务器环境的搭建和配置(除展示图片外,所有命令在Linux/Unix下适用)

    这几天领导没有安排工作,闲着没事就想把自己这两年做iOS开发时感觉知识有欠缺的地方想好好深入地补习一下,昨天和今天就计划好好学习下SVN和git的从创建和到原理,到命令,到界面的使用.一不小心被另一领 ...

  9. 转:LINUX/UNIX下的回车换行与WINDOWS下的区别

      今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了.在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 3 ...

随机推荐

  1. C++中类的静态成员变量

    1,成员变量的回顾: 1,通过对象名能够访问 public 成员变量: 2,每个对象的成员变量都是专属的: 3,成员变量不能在对象之间共享: 1,在做程序设计中,成员变量一般是私有的.至少不是公有的: ...

  2. HDU - 2181 C - 哈密顿绕行世界问题(DFS

    题目传送门 C - 哈密顿绕行世界问题 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数, ...

  3. MVC的布局页,视图布局页和分布页的使用

    一,结构如下图 二,布局页和视图布局页 1>使用方法一 _ViewStart.cshtml @{ Layout = "~/Views/Shared/_Layout.cshtml&quo ...

  4. k8s的存储卷

    存储卷查看:kubectl explain pods.spec.volumes 一.简单的存储方式 1)2个容器之间共享存储..(删除则数据消失) apiVersion: v1 kind: Pod m ...

  5. 致命错误: Call to undefined function %y-%M-%d()

    在TP5.0中套模板时出现的问题: 原有html模板代码: <input type="text" onfocus="WdatePicker({ maxDate:'# ...

  6. CSS实现不换行/自动换行/文本超出隐藏显示省略号

    在写页面的时候,我们经常会需要用到关于文本的换行,强制换行以及显示几行超过显示省略号等,今天我们就对这些问题来做个汇总吧! 1.自动换行 div{ word-wrap:break-word; word ...

  7. CentOS 7.3 环境配置java和tomcat开机启动

    Centos7下添加开机自启动服务和脚本  https://blog.csdn.net/GMingZhou/article/details/78677953 安装部分参考我的博文,仅参考他的开机启动部 ...

  8. 初学Vue

    指令.组件.数据 指令 指令带有前缀,v-表示它们是Vue提供的特殊属性.如: v-bind:绑定元素属性,如:v-bind:title v-if:条件,绑定DOM 的结构 v-for:循环,使用Ar ...

  9. kvm学习笔记(一,基础概念)

    前言 阿里云的云主机,采用的kvm,今天就花了点时间研究了下. 一.安装 官方文档参考:http://www.linux-kvm.org/page/HOWTO 二.快速建立一个基于vnc的虚拟机安装 ...

  10. Python第一章概述与环境安装

    Python简介 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项 ...