在UNIX系统中,用户有权限、进程有权限、文件有权限,有点混乱,有必要做一个总结。

1、用户权限

2、文件访问权限

《UNIX环境高级编程》p13中提到,对于磁盘上的每个文件,文件系统都存放文件所有者的用户ID和组ID。也就是说,文件只能拥有,每个文件都属于特定的用户和特定的组。使用ls -l可以查看文件的所有者的用户名和组名。下面是Ubuntu10.04下的截图。

上图中Desktop的用户是root,组是liyihai。

3、进程权限

《UNIX环境高级编程》P12中提到,如果一个进程具有超级用户权限,则大多数文件权限检查都不再进行。某些操作系统功能只限于向超级用户提供,超级用户最系统有自由的支配权。

疑问一:一个进程的权限由程序的文件权限决定还是执行这个进程的用户权限决定呢?

下面做一个测试。

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
int main(void){printf("uid = %d, gid = %d\n", getuid(), getgid());exit(0);
}

将上面的代码编译号,将生产的可执行文件的用户名改为liyihai,如下图

然后使用root用户去执行这个程序,结果如下。

由结果可见,虽然a.out的所有者为liyihai,但是root用户执行它后,其用户id是0,即root的用户id。

可以得出结论:进程的权限是由用户权限决定的,而不是程序文件的权限。 然而,根据《UNIX环境高级编程》2ndP75的说法,这也是不绝对的!

文中说,与一个进程相关的ID有6个:实际UID/GID,有效UID/GID,设置UID/GID。

实际UID/GID在登陆时就确定,一般不改变。而有效UID/GID会根据执行的(比如打开、读、写等操作,并非指二进制可执行文件!)文件是否开启了设置UID/GID而变化。如果一个文件没有开启设置UID/GID,就是上面截图的结果,其有效UID/GID和实际UID/GID一样;

如果一个文件开启了设置UID,那么对这个文件进行操作的进程的有效UID就会变成这个文件的UID!也就是说,如果一个文件的UID是root,一个普通进程打开它之后,这个进程的有效UID就变成了root!

需要注意的是,改变的是有效UID/GID,而不是实际的UID/GID,有效UID/GID用于文件的访问。

疑问二:进程是被拥有还是主动拥有?

在2中提到过,文件只能拥有,其实,进程也一样。在《UNIX环境高级编程》p14中提到,当向一个进程发送信号时,我们必须是该进程的所有者或者是超级用户。

因此,不管是文件还是进程,都是用户的财产,用户才是一切权利的中心!参考资料[1]P192也提到:“在UNIX系统中,特权是基于用户和组ID的。”这就更加印证了这个说法。

4、权限的变化

在参考资料[1]P192中提到,当程序需要增加特权,或需要访问当前并不允许访问的资源是,需要更换自己的用户ID或者组ID,使得新ID具有适合的特权或访问权限;反过来,当程序需要降低其特权或者阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。

参考资料[1]P192对于这个问题还给出了编程的提示:在设计应用程序时,总是试图使用最小特权模型。

参考资料

[1]《UNIX环境高级编程》2nd

[2]如何更改linux文件的拥有者及用户组(chown和chgrp)

UID、GID和权限相关推荐

  1. UID GID 说明及例子

    转载自:http://www.mamicode.com/info-detail-1464105.html Linux用户:Username/UID   (用户的名称和用户的UID) 管理员:root, ...

  2. Linux中UID, GID, EUID, EGID,SUID、SGID讲解

    UNIX下关于文件权限的表示方法 通常我们使用ls -l查看文件的权限.通常我们可以得到10位的权限表示法,如:-rwxr-xr-x.我们对于以下格式进行解析: 9 8 7 6 5 4 3 2 1 0 ...

  3. linux 修改 gid uid,uid, gid, setuid, setgid

    程序和进程 一般而言,程序是一个可执行的文件,而进程是程序执行的实例,一个程序可以产生任意多个进程,这些进程具有相同的代码. 用户名/组名和uid/gid 每一个用户具有一个用户名和组名以及对应的ui ...

  4. Dockerfile中npm中Error: could not get uid/gid问题的解决方法

    Dockerfile中npm中Error: could not get uid/gid问题的解决方法 参考文章: (1)Dockerfile中npm中Error: could not get uid/ ...

  5. 修改uid gid 的起始范围

    修改uid gid 的起始范围 /etc/login.defs # # Min/max values for automatic uid selection in useradd # UID_MIN ...

  6. tar: cannot change ownership to uid ***, gid ***: Operation not permitted

    参考链接: cannot change ownership to uid ***, gid *** Linux tar: Cannot change ownership to [-]: Permiss ...

  7. linux id / chown 命令 nobody uid gid 是什么

    文章目录 id 命令 语法 参数说明: 实例 chown 命令 **语法** **参数** : **实例** linux nobody用户是什么 关于 Linux UID和GID(用户ID和组ID) ...

  8. linux UID,GID,EUID,EGID,SUID,SGID

    SUID, SGID, sticky位可以参考: http://onlyzq.blog.51cto.com/1228/527247/ SUID属性只能运用在可执行文件上,当用户执行该执行文件时,会临时 ...

  9. php uid gid,用户信息,函数介绍,PHP开源CMS系统帮助文档

    一.函数名称 dr_member_info 二.函数介绍 调用会员的详细资料,含自定义字段 三.参数值参数介绍 id会员id name输出字段名称,不填就输出全部会员信息 cache缓存时间,默认10 ...

最新文章

  1. big endian little endian
  2. python【数据结构与算法】Queue,LifoQueue,PriorityQueue
  3. 代码审计_strcmp比较字符串
  4. 手机java程序_郑州北大青鸟:用手机也能编写Java程序代码?
  5. Winforn中通过NPOI导出Excel时通过XSSFClientAnchor和XSSFPicture添加图片
  6. android如何获取默认的桌面程序
  7. 十大建筑中的数学之美
  8. openstack 王者归来学习笔记
  9. .net学习---ADO
  10. main方法中args_public static void main(String [] args)– Java main方法
  11. OpenGL超级宝典第7版 配置环境第一个程序
  12. CodeCanyon上的12种最佳CSS动画
  13. windows配置mysql环境变量-mysql-5.7
  14. 七个习惯之七:不断更新
  15. 快到假期了,还抢不到票?可以试试这两个工具
  16. AirSim无人机仿真(Ubuntu18.04)
  17. win10系统怎么调烟雾弹 win10系统怎么设置烟雾弹
  18. Xilinx Srio详解IP核使用
  19. javaweb基于ssm招投标管理系统设计与实现.rar(项目源码+数据库文件)
  20. 多张图带你彻底搞懂DNS域名解析过程

热门文章

  1. java中的熔断机制_微服务熔断机制与Hystrix原理
  2. 全国二级c语言报名官网,计算机二级考哪些内容(全国计算机报名入口)
  3. 视频教程-做游戏学Python-Python语言快速入门-Python
  4. sogi锁相环原理_基于二阶广义积分软件锁相环仿真
  5. 为什么要人造元素_人造元素
  6. 【BZOJ1266】【AHOI2006】上学路线route 最短路建图转最小割
  7. 服务器启动虚拟控制台,服务器虚拟控制台设置
  8. html网页设计作业代码——代理商销售管理系统后台(8页) HTML+CSS+JavaScript web前端设计与开发期末作品_期末大作业
  9. ntp服务器部署和配置文件
  10. python 实现tar文件压缩解压的实例详解