linux保存的设置用户/组ID(set-user-ID)的测试
直接贴代码和结果
// FileName: id.cpp
#include <iostream>
#include <unistd.h>
using namespace std; int main()
{
cout << "进程ID: " << getpid() << endl;
cout << "实际用户ID: " << getuid() << endl;
cout << "有效用户ID: " << geteuid() << endl;
return 0;
}
实际ID: root(0), xyz(1000), abc(1001)
可以发现,用户xyz给程序a.out的权限加上s后,ls -l的权限字符串第4位的x变成了s,之后其他用户在执行a.out时,当前进程的有效用户ID都会变成a.out所属用户(即xyz)的ID。
每个进程都有一套ID,用户ID(UID)和组ID(GID),两者是类似的,所以这里只考虑用户ID。
POSIX.1的API可以获取的有:实际用户ID和有效用户ID
实际用户ID就是/etc/passwd里的ID,有效用户ID是在执行某些系统调用时用来进行权限验证的,一般情况下等于实际用户ID。只有在设置了set-user-ID对应的权限位后(比如rwx变成了rws)有效ID才和实际ID产生了差别。
也就是说,用户xyz想让其他用户可以执行自己的这个应用程序(a.out),用户xyz可以用chmod o+x a.out让其他用户拥有执行(x,即execute)的权限。但是a.out程序内部又有需要验证有效ID的系统调用(比如open函数),这时用户xyz就可以用chmod u+s a.out来让其他用户顺利通过这一层测试。
再来个例子
// FileName: append.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h> int main(void)
{
char filename[] = "file.txt";
int fd; if ((fd = open(filename, O_WRONLY | O_APPEND)) == -1) {
fprintf(stderr, "open %s error: %s\n", filename, strerror(errno));
exit(1);
} // 忽略了错误处理以及关闭文件描述符的操作
char buf[BUFSIZ];
snprintf(buf, BUFSIZ, "Access ID: %ld\n", (long)getuid());
write(fd, buf, strlen(buf)); return 0;
}
可以看出在设置用户ID位没有被设置时(APUE的说法,说得很绕口,简单地可以理解为表示用户权限的x没有变成s),用户abc通过权限位x获得了执行a.out的权限,但是却无法打开所属用户ID为xyz的文件file.txt,因为open函数写入时需要检查权限(而file.txt的权限位是rw-rw-r--,最后3位是其他用户,可以看出是没有写入权限的),因此以O_WRONLY来打开file.txt时会Permission denied,被权限挡住。
而在设置好设置用户ID位后,open函数验证权限时发现有效ID是xyz(虽然实际ID是abc),通过验证。
linux保存的设置用户/组ID(set-user-ID)的测试的更多相关文章
- linux系统学习笔记:无死角理解保存的设置用户ID,设置用户ID位,有效用户ID,实际用户ID
一.基本概念 实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一的确定,就是登录的用户的uid. 有效用户ID(EUID):用于系统决定用户对系统资源的权限,也就是说当用 ...
- Linux实际用户(组)ID,有效用户(组)ID,设置用户(组)ID
实际用户(组)ID: 标识用户是谁,这两个字段在登录时取自口令文件中的登录项. 有效用户(组)ID: 决定了对文件的访问权限,通常有效用户(组)ID等于实际用户(组)ID,谁运行有效ID就等于谁的实际 ...
- 实际用户ID,有效用户ID,保存的设置用户ID
Unix中常见的几个概念,下面做一个解释. 首先需要明确一点,这几个概念都是和进程相关的. real user ID表示的是实际上进程的执行者是谁,effective user ID主要用于校验该进程 ...
- Linux基础3(用户/组管理,rpm,yum,源码安装软件)
用户管理 与用户相关的配置文件 /etc/passwd /etc/shadow /etc/skel /etc/defalut/useradd /etc/login.defs useradd userm ...
- 三 SVN权限设置&用户&组
创建组,添加用户之后进行权限的设置:
- linux服务器如何设置目录权限,让开发只能在测试目录下开发,不在线上目录上开发
当一台服务器上,既有测试环境,也有生成的环境,开发需要在线上测试,如果开发生产环境的权限,那开发容易误操作 需求如下: (1)生产环境的代码,必须有专用的账号登陆进行管理 (2)开发测试环境的代码,开 ...
- 【转】linux 设置用户id 设置组id
linux 设置用户id 设置组id 转自 linux 设置用户id 设置组id 最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个 ...
- 设置用户ID和设置组ID
与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户I ...
- 文件和目录之设置用户ID和设置组ID
与一个进程相关联的ID有6个或更多,它们如表4-4所示: 表4-4 与每个进程相关联的用户ID和组ID 实际用户ID 我们实际上是谁 实际组ID ...
随机推荐
- Linux 挂载系统盘
适用系统:非IO优化+SSD云盘Linux(Redhat , CentOS,Debian,Ubuntu)实例,IO优化实例+SSD云盘数据盘分区挂载建议使用脚本:工具:auto_fdisk_ssd.s ...
- 探究JS中的连等赋值问题
一.引子 最近在看别人的博客时无意中看到一个这样的问题 var a = {n: 1}; var b = a; a.x = a = {n:2}; console.log(a.x); //undefine ...
- 【javascript基础】运算符优先级
优先级 运算类型 关联性 运算符 1 成员运算符 从左到右 . [] new 从右到左 new 2 函数调用运算符 从左到右 () 3 自增运算符 n/a ++ 自减运算符 n/a -- 4 逻辑非运 ...
- make笔记
Makefile基本格式如下: target ... : prerequisites ... command ... ... 其中, target - 目标文件, 可以是 Object File, 也 ...
- 向量点积(Dot Product),向量叉积(Cross Product)
参考的是<游戏和图形学的3D数学入门教程>,非常不错的书,推荐阅读,老外很喜欢把一个东西解释的很详细. 1.向量点积(Dot Product) 向量点积的结果有什么意义?事实上,向量的点积 ...
- Django的CBV
CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承.封装.多态).所以Dja ...
- JSP学习(四)JSP属性范围
P属性范围 四种属性范围分别指以下四种: 当前页page:一个属性只能在一个页面中取得,跳转到其他页面无法取得 一次服务器请求request:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页 ...
- BZOJ4521 Cqoi2016 手机号码 【数位DP】
Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出 ...
- XML 的 XPath 语法
XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言.无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件. 本文将介绍 ...
- ASP.NET中几种加密方法
下面就是ASP.NET中几种加密方法.加密算法有两种,也就是上面提到的MD5和SHA1,这里我举的例子是以MD5为例,SHA1大致相同,只是使用的类不一样. MD5的全称是Message-Digest ...