【注】*NIX 下很重要的概念是「一切皆文件」;以下仅以 *NIX 家族的起源 UNIX 作为分析对象。
以 Ext2 文件系统为例,inode 信息在文件系统的结构层次如下:
【注】stat 命令可以查看文件的 inode 信息。
其中,r 代表 Read 权限,w 代表 Write 权限,x 代表 Execute 权限。rwx 权限位组合在一起用来表示文件具有的基本权限,可使用 ls -l 命令列出文件的基本权限位信息,在对应位若为 -,则表明不具有对应位权限;若为对应 r\w\x 字母,则表明具有对应权限。每组 rwx 权限位组合对应的权限数值如下表(对应权限位为 0 代表不具有该权限,为 1 代表具有该权限):
r w x 权限数值 0 0 0 0 0 0 1 1 0 1 0 2 0 1 1 3 1 0 0 4 1 0 1 5 1 1 0 6 1 1 1 7
chmod 745 foo # 将 foo 文件权限数值改为 745(7 4 5 依次对应文件拥有者、文件拥有者所在组、其他人的权限)
比如: 在 UNIX 下的 cat 和 more 命令调用了 read() 系统调用,用户要想使用其显示某文件内容,则必须满足两个权限要求:
同理: 在 UNIX 下用户要想使用某个命令写文件,也必须满足两个权限要求:
除了上述说明的三组 rwx 共 9 位权限位外,UNIX 下文件还具有另外 3 位特殊权限位:suid\sgid\sticky。该三位特殊权限位组成一组,使用 chmod 命令时该组权限值放在最前面:chmod 4755 xxx
其中 4 即为该组特殊权限位组。
【注】用户运行程序后是该进程的拥有者(ruid),进程执行者(euid)代表该进程以相应身份访问系统资源。若位设置 suid 位,ruid 和 euid 均为当前用户 id;设置了 suid 位后,ruid 仍为当前用户 id,euid 为该程序文件的拥有者 id。(ruid、euid 解释见下文 4)
比如: 用户 Jane 运行命令
view memo.txt
,view 和 memo.txt 的权限和所用者信息如下: -rwx--x--x 1 root bin 4515 Aug 14 13:08 # view -rw------- 1 root bin 218 Aug 14 13:08 # memo.txt 由于 Jane 用户运行 view 程序时对应的进程的 euid 为 Jane 用户 id,而 Jane 对 memo.txt 文件不具备可读权限,故无法执行。但利用 chmod 命令将 view 程序的权限改为 4755 则可以执行该命令: -rws--x--x 1 root bin 4515 Aug 14 13:08 # view -rw------- 1 root bin 218 Aug 14 13:08 # memo.txt 原因在于设置了 suid 后,Jane 用户运行 view程序时对应的进程的 euid 为 view 程序文件的拥有者 root 的 id,而 root 用户具备对 memo.txt 文件的可读权限,故该命令可以正常执行。
【注】设置了 suid 后,利用 ls -l 命令显示时 suid 对应文件拥有者那组 rwx 中的 x 位:
【注】设置了 sgid 后,利用 ls -l 命令显示时 sgid 对应文件拥有者所在组那组 rwx 中的 x 位:
【注】设置了 sticky 后,利用 ls -l 命令显示时 sticky 对应其他用户那组 rwx 中的 x 位:
UNIX 目录在文件系统也是作为广泛意义上的文件,只是其中存储的不是文件内容,而是其包含的文件的文件名和对应文件的 inode 指针。
【注】在 UINX 中,目录的权限不具有继承性,即不能被子目录继承。故访问一个路径下的文件时,需要整个路径上的目录都具有执行权限。
每个 inode 节点都有一个链接计数,表示指向该 inode 节点的 inode 指针数。只有当链接计数减少为 0 时,才表示删除了该文件。链接计数表示的是该文件拥有的硬链接数,创建硬链接时,系统不会为它重新分配 inode,而是在目录下直接添加一个指向文件 inode 节点的 inode 指针项。
【注】硬链接不可以在不同文件系统间建立。对于目录的硬链接,只有超级用户可以创建。
对一个 inode 节点的间接指针,不同于硬链接,容易被清除。创建符号链接时,系统会分配一个新的 inode 节点,所以符号链接的 inode 号和文件的 inode 号不相同。符号链接中的 inode 里存放者指向文件的路径,当文件的被删除时,符号链接也就失效了。
【注】符号链接可以跨文件系统建立。任何用户均可创建文件的符号链接。
UNIX 系统中,每个用户有一个唯一的 UID。
同时,用户可以属于某一个组,组 ID 是系统管理员分配的。
ID 说明 ruid rgid 在登录系统时取自口令文件中的登录项 euid egid 用于文件存取许可权检查,决定了对文件的访问权 suid sgid 由 exec 函数保存,保存了 euid 和 egid 的副本
【注】此 suid 非上文说到的文件权限 suid 位。
每个进程拥有一个非负整数的唯一进程 ID。
UNIX 支持在不同进程间共享打开文件。内核使用三个数据结构,使多个进程共享一个文件。