UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限
lienhua34
2014-09-03
通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID。但有时我们需要知道当前登录用户对某个文件访问权限。虽然说进程的有效用户 ID 和有效组 ID 通常分别等于当前登录用户 ID 和用户所在组 ID。例如,一个进程可能因设置用户 ID 以另一个用户权限运行,它仍可能想验证当前实际登录的用户是否能否访问一个给定的文件。
access 函数提供了按照实际用户 ID 和实际组 ID 进行访问权限测试的功能。其校验步骤跟之前说的内核校验步骤一致,只是将“有效”改成了“实际”。
#include <unistd.h>
int access(const char *pathname, int mode);
返回值:若成功则返回0,若出错则返回-1.
其中,mode 是表 1 中所列常量的按位或。
| mode | 说明 |
| R_OK | 测试读权限 |
| W_OK | 测试写权限 |
| X_OK | 测试执行权限 |
| F_OK | 测试文件是否存在 |
例子:
下面程序测试当前登录用户对命令行第一个参数是否具有读权限,然后以只读的方式打开该文件。
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int
main(int argc, char *argv[])
{
if (argc != ) {
printf("usage: accessdemo <pathname>");
exit(-);
}
if (access(argv[], R_OK) < ) {
printf("access error for %s: %s\n", argv[], strerror(errno));
} else {
printf("read access OK\n");
}
if (open(argv[], O_RDONLY) < ) {
printf("open error for %s: %s\n", argv[], strerror(errno));
} else {
printf("open for reading OK\n");
}
exit();
}
编译该程序,生成 accessdemo,然后运行该程序,
lienhua34:demo$ gcc -o accessdemo accessdemo.c
lienhua34:demo$ ls -l accessdemo
-rwxrwxr-x lienhua34 lienhua34 9月 : accessdemo
lienhua34:demo$ ./accessdemo accessdemo
read access OK
open for reading OK
lienhua34:demo$ ls -l /etc/shadow
-rw-r----- root shadow 4月 : /etc/shadow
lienhua34:demo$ ./accessdemo /etc/shadow
access error for /etc/shadow: Permission denied
open error for /etc/shadow: Permission denied
lienhua34:demo$ su
# chown root accessdemo
# chmod u+s accessdemo
# ls -l accessdemo
-rwsrwxr-x root lienhua34 9月 : accessdemo
# exit
exit
lienhua34:demo$ ./accessdemo /etc/shadow
access error for /etc/shadow: Permission denied
open for reading OK
我们来分析一下上面的运行命令序列及其结果。
1. 起先,文件 accessdemo 的所有者是 lienhua34(当前登录用户),运行./accessdemo acessdemo 时,进程的实际用户和有效用户都是lienhua34,则 access 函数和 open 函数都能够成功。(第1到6行)
2. 文件/etc/shadow 的所有者是 root,且其只允许 root 用户读取。此时运行./accessdemo /etc/shadow,进程的实际用户的有效用户都是 lienhua34,则 access 函数和 open 函数都失败了。(第7到11行)
3. 切换后超级用户 root,将文件 accessdemo 的所有者修改为超级用户root(运行命令chown root accessdemo,并设置文件 accessdemo 的设置用户 ID 位(运行命令chmod u+s accessdemo)。(第12到18行)
4. 切换后当前登录用户 lienhua34,此时运行./accessdemo /etc/shadow,进程的实际用户为 lienhua34,但有效用户为超级用户 root(因文件accessdemo 的所有者为 root 且设置了设置用户 ID 位)。此时 access函数校验当前登录用户 lienhua34 对文件/etc/shadow 读权限失败,但open 函数却能够打开文件/etc/shadow(内核用进程的有效用户 ID进行访问权限校验)。(第19到21行)
(done)
UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限的更多相关文章
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...
- UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mod ...
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
lienhua342014-08-23 UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符. #include <unistd.h> int dup(int fi ...
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...
随机推荐
- 基于html5海贼王单页视差滚动特效
分享一款基于html5海贼王单页视差滚动特效是一款流行滑落网页特效代码.效果图如下: 在线预览 源码下载 实现的代码: <div class="top"> < ...
- 项目抛弃Tomcat容器,用代码启动Tomcat插件
tomato启动代码如下: package tomcat; import org.apache.catalina.connector.Connector; import org.apache.cata ...
- Web程序中的懒加载异常说明及解决方案
所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...
- json数据在前端(javascript)和后端(php)转换
学习目的:前后端数据交换 思路: json数据格式是怎么样? 后端各种语言怎么将自己内容转换成json格式的内容? 前端怎么接收json数据?有几种方式? js中怎么将json数据转换成js中的数 ...
- 如何提高JavaScript代码质量
如何编写可维护的JavaScript代码 代码风格及规范 构建检查工具 jshint配置 http://jshint.com/docs/options/ http://www.cnblogs.com/ ...
- 一个简单有效的kubernetes部署案例
部署web-rc:web应用需要去获取redis注入的ip环境变量cluster_ip,以此来访问 [root@sdw1 files]# cat testweb-rc.yaml kind: Repli ...
- HBase解决海量图片存储方案
随着互联网.云计算及大数据等信息技术的发展,越来越多的应用依赖于对海量数据的存储和处理,如智能监控.电子商务.地理信息等,这些应用都需要对海量图片的存储和检索.由于图片大多是小文件(80%大小在数MB ...
- XML(五)dom4j增删改查
book2.xml <? xml version="1.0" encoding="UTF-8"?> <书架> <书> < ...
- css3常用动画样式文件move.css
move.css zoomIn zoomInDownouter-circlearrowTop expandOpen fadeIn fadeInNormal fadeInUp fadeInRi ...
- USB学习笔记连载(十一):CY7C68013A的启动方式-EEPROM
上述的应用笔记中有介绍FX2LP的启动选项,主要包括I2C启动和USB启动. 说白了I2C启动需要使用外部的EEPROM,USB启动,只是使用上位机控制软件将配置程序FX2LP中,不用EEPRO ...