Part 1 文件与目录

设置用户ID和设置组ID

与一个进程相关联的ID有6个或更多。

  1. 实际:
    实际用户ID/实际组ID 我们实际上是谁
  2. 有效:
    有效用户ID/有效组ID/附属组ID 用于文件访问权限检查
  3. 保存的设置:
    保存的设置用户ID/保存的设置组ID 由exec函数保存
  • 实际用户ID和实际组ID标识我们究竟是谁。这两个字段在登陆时取自口令文件中的登陆项。通常,在一个登陆会话期间这些值并不改变,但是超级用户进程有方法改变它们。
  • 有效用户ID,有效组ID以及附属组ID决定了我们的文件访问权限。
  • 保存的设置用户ID和保存的设置组ID在执行一个程序包含了有效用户ID和有效组ID的副本。

通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。

每个文件有所有者和组所有者,所有者由stat结构中的st_uid指定,组所有者则由set_gid指定。

当执行一个程序文件是,进程的有效用户ID通常就是实际用户ID,有效组ID通常是实际组ID。但是可以在文字模式字(st_mode)中设置一个特殊标志,其含义是"当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(set_uid)".与此相类似,在文件模式字中可以设置另一位,它将执行此文件的进程的有效组ID设置为文件的组所有者ID(st_gid).在文件模式字中的这两位被称为设置用户ID(set-user-ID)位和设置组ID(set-group-ID)位.也就是SUID,SGID.

例如,若文件所有者是超级用户,而且设置了该文件的设置用户ID位,那么当该程度文件由一个进程执行时,该进程具有超级用户权限。不管执行此文件的进程的实际用户ID是什么,都会是这样。例如UNIX系统程序passwd(1)允许任一用户改变其口令,该程序是一个设置用户ID程序。因为该程序应能将用户的新口令写入口令文件中(一般是/etc/passwd或/etc/shadow),而只有超级用户才具有对该文件的写权限,所以需要使用设置用户ID功能。因为运行设置用户程序的进程通常会得到额外的权限,所以编写这种程序时要特别谨慎。

再回到stat函数,设置用户ID位及设置组ID位都包含在文件的st_mode值中.这两位可分别用常量S_ISUID和S_ISGID测试.

stat结构体:

struct stat{mode_t           st_mode;ino_t           st_ino;dev_t            st_dev;dev_t            st_rdev;nlink_t         st_nlick;uid_t          st_uid;gid          st_gid;off_t            st_size;struct timespec st_atime;struct timespec st_mtime;struct timespec st_ctime;blksize_t        st_blksize;blkcnt_t         st_blocks;
};

文件访问权限

st_mode值也包含了对文件的访问权限位。当提及文件时,指的是前面所提到的任何类型的文件。所以文件类型(目录,字符特别文件等)都有访问权限(access permission)。很多人认为只有普通文件有访问权限,这是一种误解。

9个访问权限,取自<sys/stat.h>

st_mode屏蔽 含义
S_IRUSR 用户读
S_IWUSR 用户写
S_IXUSR 用户执行
S_IRGRP 组读
S_IWGRP 组写
S_IXGRP 组执行
S_IROTH 其他读
S_IWOTH 其他写
S_IXOTH 其他执行

三类访问权限(即读,写,执行)以各种不同的函数使用。我们将这些不同的使用方式汇总在下面。当说明相关函数时,再进一步讨论。

  • 第一个规则是,我们用名字打开任一类型文件时,对该名字中包含的每一个目录,包含它可能隐含的当前工作目录都应具有执行权限。这就是为什么对于目录执行权限位常被称为搜索位的原因。
    例如,为了打开/usr/include/stdio.h,需要对目录/、/usr和/usr/include具有执行权限。然后,需要具有对文件本身的适当权限,这取决于以何种模式打开它(只读,读-写等)。
    如果当前目录是/usr/include,那么为了打开文件stdio.h,需要对当前目录有执行权限。这是隐含当前目录的一个实例。打开stdio.h文件与打开./stdio.h作用相同。注意,对于目录的读权限和执行权限的意义是不同的。读权限允许我们读目录,获得在该目录中所有文件名的列表。当一个目录是我们要访问文件路径的一个组成部分时,对该目录的执行权限使我们可通过该目录(也就是搜索该目录,寻找一个特定的文件名)引用隐含目录的另一个例子是,如果PATH环境变量指定了一个我们不具有权限的目录,那么shell绝不会在该目录下找到可执行文件。
  • 对于一个文件的读权限决定了我们是否能够打开现有文件进行读操作。这与open函数的O_RDONLY和O_RDWR标志相关。
  • 对于一个文件的写权限决定了我们是否能够打开现有文件进行写操作。这与open函数的O_WRONLY和O_RDWR标志相关。
  • 为了在open函数中对一个文件指定O_TRUNC标志,必须对该文件具有写权限。
  • 为了在一个目录中创建一个新文件,必须对该目录有写权限和执行权限。
  • 为了删除一个现有文件,必须对包含该文件的目录具有写权限的执行文件。对该文件本身不需要有读,写权限。
  • 如果用7个exec函数中的任何一个执行某个文件,都必须对该文件具有执行权限。该文件还必须是一个普通文件。

开发日记-20190828 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 4相关推荐

  1. UNIX环境高级编程第二版_扫描 版笔记

    pread/pwrite 相当于 lseek,read/write  ,只是pread/pwrite具有原子性,定位和读写操作不可中断 dup(fd); = fcntl(fd,F_DUPFD,0); ...

  2. 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2

    Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...

  3. 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3

    Referred Blogs 文件描述符标志,文件状态标志 Linux中文件描述符fd和文件指针flip的理解 Linux编程–文件描述符fd 文件共享 Unix支持在不同进程间共享文件. 内核使用了 ...

  4. 开发日记-20190522 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》

    前言 世界上最最愚蠢的事情就是重复,世界上最唯美的事情就是简单.把东西变得简单才是本事,这是我一直信奉的教条. 其实我一直想好好学学Linux,可是很多时候真的很无奈,尽管我挺喜欢买书而且在一定程度上 ...

  5. 开发日记-20190902 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 7

    读目录 对某个目录具有存取许可权的单一用户都可读该目录,但是只有内核才能与目录(防止文件系统发生混乱).一个目录的写许可权位和执行许可权位决定了在该目录中是否能够创建新文件以及删除文件,它们并不表示能 ...

  6. 开发日记-20190820 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 1

    Part 1:fork创建一个子进程过程 在父进程调用fork创建一个子进程.新进程是调用进程的复制品,故称调用进程为父进程,新创建的进程为子进程.fork对父进程返回非负进程ID,对子进程返回0.因 ...

  7. 开发日记-20190830 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 6

    Preface 今天的天气其实真的很棒,所以还是希望自己能够出去玩玩. Content 函数futimens,utimensat和utimes 一个文件的访问和修改时间可以用以下的几个函数更改.fut ...

  8. 开发日记-20190829 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 5

    函数access和faccessat 当说明用open或creat创建文件时,没有说明赋予新文件的用户ID和组ID的值是什么.关于新目录的所有权与本节将说明的新文件的所有权的规则相同. 新文件的用户I ...

  9. 开发日记-20190807 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 21

    Preface 今天对于网络请求到底是如何发送有了相对深入的理解.明天的话,第12章也就结束了,感觉看到这里,有点飘飘欲仙的感觉了.的确,对于有些人来说,这类书是作为字典用的,但是我啊,只是因为好奇, ...

最新文章

  1. caffe预测、特征可视化python接口调用
  2. javaweb学习总结(二十一)——JavaWeb的两种开发模式
  3. 短信发送:webservice调用第三方接口发送短信
  4. 传惠普CEO李艾科将部署全新战略计划
  5. clob和blob是不是可以进行模糊查询_你知道什么是 MySQL 的模糊查询?
  6. Traceroute程序
  7. EDA实验课课程笔记(八 )——PT(Prime Time)简介(附录静态时序分析)
  8. linux目录数据块,如何在Linux上列出文件的数据块?
  9. php 5.6.27 在某些机器上正常,thinkphp5开发的网站出现”No input file specified”(php版本5.6.27)...
  10. Linux下安装anaconda,创建虚拟环境python3.7,并且安装深度学习框架pytorch进行模型训练
  11. 博科光纤交换机配置及管理 B/S篇
  12. JDK下载安装及环境变量配置的图文教程(详解)
  13. 浏览器保存图片时,将jfif改为jpg格式
  14. 【PMP】PMBOK 笔记 第6章 项目时间管理
  15. Element-UI下拉框el-select实现拼音搜索
  16. Python爬虫:7_BeautifulSoup4图片爬取
  17. 姜维拥兵10万 为何守不住刘备的半壁江山
  18. 树莓派部署安装lnmp及可道云
  19. OCR EasyOCR + PaddleHub 光学字符识别(Optical Character Recognition, OCR)
  20. 判断题 PHP程序的扩展名必须是.php,PHP笔试题目

热门文章

  1. linux下free命令详解
  2. fiddler设置抓取https请求后打开网页总是报“你的连接不是私密链接”的解决办法
  3. Redis可以登录,但有些值不能获取或者设置,PING命令也用不了
  4. Linux下的USB总线驱动 mouse
  5. android开发toast通知,Toast Notifications
  6. springboot的jsp应该放在哪_详解SpringBoot 添加对JSP的支持(附常见坑点)
  7. python blp模型 估计_第三章 BLP模型(Bell-La Padula模型) | 学步园
  8. java注册用户代码_java用户管理注册功能 含前后台代码
  9. java 类参数_Java的数据类型和参数传递(详解)
  10. 关系数据库概念辨析❤️