linux/unix下setuid/seteuid/setreuid/setresuid
其中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的更多相关文章
- 10分钟 教你学会Linux/Unix下的vi文本编辑器
10分钟 教你学会Linux/Unix下的vi文本编辑器 vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结.不敢独享,和你们共享. 首先,记住v ...
- 【Linux】linux/unix下telnet提示Escape character is '^]'的意义
在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...
- linux/unix下telnet提示Escape character is '^]'的意义
在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...
- Linux/UNIX 下 “command not found” 原因分析及解决
在使用 Linux/UNIX 时,会经常遇到 "command not found" 的错误,就如提示的信息,Linux /UNIX 没有找到该命令.原因无外乎你命令拼写错误或 L ...
- Linux/Unix下设置定时任务
Unix系统提供了cron和at命令,使系统和用户可以定时运行一定的程序,而不需手工启动. 使用cron用于周期性的执行一个命令,为了使用它,必须编辑crontab文件.系统缺省的/etc/cront ...
- 教你学会Linux/Unix下的vi文本编辑器
vi编辑器是Unix/Linux系统管理员必须学会使用的编辑器.看了不少关于vi的资料,终于得到这个总结. 首先,记住vi编辑器的两个模式:1.命令模式 2.编辑模式. 在一个UNIX/Linux的s ...
- linux/Unix下的vim/vi指令的使用方法
概述 以下这篇文章介绍的是关于vim的使用方法,由于我本身对linux没有太多的研究,写下的这篇文章纯属是在实际中经常使用vim指令,想通过这篇文章记录下来,方便以后使用时查找方便.个人认为,对于普通 ...
- Mac下SVN服务器环境的搭建和配置(除展示图片外,所有命令在Linux/Unix下适用)
这几天领导没有安排工作,闲着没事就想把自己这两年做iOS开发时感觉知识有欠缺的地方想好好深入地补习一下,昨天和今天就计划好好学习下SVN和git的从创建和到原理,到命令,到界面的使用.一不小心被另一领 ...
- 转:LINUX/UNIX下的回车换行与WINDOWS下的区别
今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了.在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 3 ...
随机推荐
- css深入理解overflow
1.基本属性 visible(默认值) 超出部分仍然正常显示 hidden 超出后隐藏 scroll 滚动条一致显示 auto 自适应 显示或隐藏滚动条 inherit overflow = ov ...
- Volatile 只保证可见性,并不保证原子性
[尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/52525724 在说明Java多线程内存可见性之前,先来简单了解一下J ...
- VM虚拟机启动centos出现内部错误
内部错误 解决办法 1.关闭虚拟机后,单击VM,右键,以管理员身份运行. 2.找到电脑的 管理— Vmware workstation server ,默认状态下是手动,把他改为自动重启就可以啦.
- python删除某一行
整理了网络上的一些方法,一般有两种方法:第一种:是先把文件读入内存,在内存中修改后再写入源文件. 例子:将内容包含“123”的所有行删去: with open('C:/Users/lai/Deskto ...
- java并发编程之美-阅读记录11
java并发编程实践 11.1ArrayBlockingQueue的使用 有关logback异步日志打印中的ArrayBlockingQueue的使用 1.异步日志打印模型概述 在高并发.高流量并且响 ...
- Java面试宝典(6)混合(前端 + 数据库)
包括html & JavaScript & Ajax部分/Java web部分/数据库部分 三. html&JavaScript&ajax部分 1. 判断第二个日期比第 ...
- linux基本命令的简单介绍
基本命令 man:查看帮助信息 :一般系统命令太多,要记住这些命令是不可能的,man是一个联机帮助信息 man提供大量的帮助信息,一般分为以下4各部分 NAME:对命令的简单介绍 SYNOPSIS对命 ...
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- 如何加快Vue项目的开发速度
如何加快Vue项目的开发速度 本文摘自奇舞周刊,侵权删. 现如今的开发,比如内部使用的管理平台这种项目大都时间比较仓促.实际上来说,在使用了webpack + vue 这一套来开发的话已经大大了提高了 ...
- UNP学习 广播
一.概述 虽然UDP支持各种形式的地址,但TCP只支持单播地址. 上图要点是: IPv4对多播的支持是可选的,而IPv6则时必须的. IPv6没有提供对广播的支持:当使用广播的IPv4应用程序一直到I ...