linux中文件的模式和权限

  Linux的文件,有个16位的字来表示文件的类型和属性信息,其中4位表示文件的类型信息,剩下的12位表示文件的模式。
    在传统的unix和linux文件系统模型中,每个文件都有一个9个权限位用来控制谁能够读写和执行该文件内容,还有一个3个权限位来影响可执行程序运行,这12个位就共同构成了该文件的“模式”(mode)。

    权限位
    9个权限位用来确定可以由谁对文件执行什么样的操作,传统的unix不能逐个用户地去设置权限,而是为文件的属主、文件的属组和其他每个人设置权限集合,每个集合有3位:读取位、写入位和执行位。
    这样9个权限位就分别被分成3组,每组有3位。最前面的一组3位控制属主的访问权限,第二个三位组控制组的访问权限,最后的三位组控制其他每个人访问权限。在每个3位组中,高位是读取位,中间位是写入位,低位是执行位。
    在普通文件上,读取位允许打开文件并读取它的内容。写入位允许修改和删截该文件的内容。不过,能否删除和重命名(或者删除后再建)该文件则由该文件的父目录上的权限设置所控制,因为名字到数据空间的映射关系实际上存储在父目录中。执行位表示该文件是否是可执行的。
    对于目录来说,其实也是文件文件,只是有点不同。当分析路径名时,执行位(在这种上下文环境中,也经常叫做“搜索(search)”位或者叫做“扫描(scan)”位)的作用是控制是否能够进入或者通过该目录,读取位和执行位的组合作用才是控制是否列出目录的内容,写入位和执行位的组合作用则表示是否允许在目录中创建、删除和重命名文件
    用计算机二进制形式表示9个权限位如下:


    setuid和setgid位
    linux文件属性mode这12位标记,去除上面所用的9个权限位,还有3个特殊权限位,这3个特殊权限位是控制进程运行时的表现的,这3位中高位是setuid位,中间位是setgid位,低位是sticky位(粘附位)。在继续探讨这3个位之前,我们先来简单介绍一些辅助信息。
    linux的进程至少有7个与之相关的标识:一个真实UID(real UID)、一个有效UID(effective UID)和一个保存UID(saved UID);一个真实GID(read GID)、一个有效GID(effective GID)和一个保存GID(saved GID);还有一个文件系统UID(filesystem UID)。
    简单的说,read UID/GID就是进程创建者的UID/GID。EUID(effective UID)/GUID用来确定进程在任何给定的时刻对哪些资源或者文件具有访问权限,即进程在运行是其当前的“虚拟身份”,也就是说在进程运行时候其UID和GID可能不是创建它的用户的UID和GID,但是在一般情况下,UID/GID和EUID/EGID是一样的。SUID(saved UID)/SGID(saved GID)表示进程刚刚开始执行时刻,进程EUID/EGID的副本。而FSUID(filesystem UID),它只用来对文件系统权限的判断,但在内核之外并不常用。
    尽管通常对于一个进程来说不大可能会改变它自己的归属关系状态(即默认情况UID/GID=EUID/EGID),但在一种特殊情况下,可以修改进程的EUID和EGID。当执行设置了setuid和setgid的权限位的命令时,则当该命令运行时,其EUID/EGID为该程序命令的映像文件的UID或者GID,而不是启动运行该命令的用户UID/GID。一个例子就是passwd命令,其程序命令的映像文件的UID/GID都是root,但是当一个普通用户运行这个命令时(因为passwd可执行文件设置了其他人的执行权限),则这个用户开启的passwd命令进程的EUID/EGID=root而非该普通用户。
    既然setuid和setgid设置后的进程的EUID/EGID不是进程启动者的UID/GID,而是进程映像文件所有者的UID/GID,故该程序所产生的任何操作的“身份”都是这个“虚拟身份”,即都是EUID/EGID。
    下面用touch命令来解释这个问题,默认touch是没有设置setuid和setgid的,那么用户touch后的文件的UID/GID都是touch发起者的UID/GID。如下:
[oracle@perf_digital ~]$ ls -l /bin/touch
-rwxr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
[oracle@perf_digital ~]$ touch a
[oracle@perf_digital ~]$ ls -l
total 0
-rw-r--r-- 1 oracle dba 0 Oct 9 23:08 a
    然后,用root账号给touch增加setuid位,如下:
[root@perf_digital ~]# ls -l /bin/touch
-rwxr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
[root@perf_digital ~]# chmod u+s /bin/touch
[root@perf_digital ~]# ls -l /bin/touch
-rwsr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
    之后,普通用户再次touch新文件,发现文件的属主发生了变化,如下:
[oracle@perf_digital ~]$ touch b
[oracle@perf_digital ~]$ ls -l
total 0
-rw-r--r-- 1 oracle dba 0 Oct 9 23:08 a
-rw-r--r-- 1 root   dba 0 Oct 9 23:12 b
    我们再用root账号给touch增加setgid位,如下:
[root@perf_digital ~]# ls -l /bin/touch
-rwsr-xr-x 1 root root 42696 Jul 13 2009 /bin/touch
[root@perf_digital ~]# chmod g+s /bin/touch
[root@perf_digital ~]# ls -l /bin/touch
-rwsr-sr-x 1 root root 42696 Jul 13 2009 /bin/touch
    然后,普通用户再次touch新文件,发现文件的属组也发生了变化,如下:
[oracle@perf_digital ~]$ touch c
[oracle@perf_digital ~]$ ls -l
total 0
-rw-r--r-- 1 oracle dba 0 Oct 9 23:08 a
-rw-r--r-- 1 root   dba 0 Oct 9 23:12 b
-rw-r--r-- 1 root   root 0 Oct 9 23:15 c
    简单的总结一下,就是setuid和setgid是让程序执行的时候“临时的”的拥有了程序文件所有者的uid和gid,等程序执行完后再恢复到发起者的权限。
    对于目录,如果在某个目录上设置了setgid位以后,在这个目录中心创建的文件具有该目录的属组权限而不是创建该文件的用户的默认属组。至于对目录设置setuid,是不起任何作用的。看下面这个例子:
[oracle@perf_digital st]$ mkdir a
[oracle@perf_digital st]$ mkdir b
[oracle@perf_digital st]$ mkdir c
[oracle@perf_digital st]$ ll
total 12
drwxr-xr-x 2 oracle dba 4096 Oct 9 23:27 a
drwxr-xr-x 2 oracle dba 4096 Oct 9 23:27 b
drwxr-xr-x 2 oracle dba 4096 Oct 9 23:27 c
[oracle@perf_digital st]$ chmod u+s a
[oracle@perf_digital st]$ chmod g+s b
[oracle@perf_digital st]$ chmod +s c
[oracle@perf_digital st]$ ll
total 12
drwsr-xr-x 2 oracle dba 4096 Oct 9 23:27 a
drwxr-sr-x 2 oracle dba 4096 Oct 9 23:27 b
drwsr-sr-x 2 oracle dba 4096 Oct 9 23:27 c
    利用root用户新建文件,只有setgid位起到了作用,如下:
[root@perf_digital st]# touch a/u
[root@perf_digital st]# ls -l a/
total 0
-rw-r--r-- 1 root root 0 Oct 9 23:28 u
[root@perf_digital st]# touch b/g
[root@perf_digital st]# ls -l b/
total 0
-rw-r--r-- 1 root dba 0 Oct 9 23:28 g
[root@perf_digital st]# touch c/ug
[root@perf_digital st]# ls -l c/
total 0
-rw-r--r-- 1 root dba 0 Oct 9 23:28 ug

    sticky位
    mode中特殊权限位的低位就是sticky位,称为“粘附位”。在早期的unix系统上,它作为限定符对于可执行文件来说很重要。不过,粘附位的含义现在已经过时了,现在操作系统已经悄然地忽略了它。
    如果在目录上设置了这个粘贴位,那么除非您是该目录的属主、该文件的属主或者是超级用户,否则文件系统不会允许删除或者重新命令该目录中的文件。

    到目前为止,linux文件属性mode的12位已经全部介绍完了,它可以使用二进制形式如下来表示:


    mode的八进制表示法
    mode的12位根据上面的探讨,都是每三位分成一个组合,那么刚好可以使用4个八进制来表示这12位数字。
    先不看特殊权限位,在9个用户访问权限位上,前面3位代表控制属主的访问权限,读、写、执行权限对应的八进制分别为400、200、100;第二个3位控制组的访问权限,读、写、执行权限对应的八进制分别为40、20、10;第三个3位控制其他每个人的访问权限,读、写、执行权限对应的八进制分别为4、2、1。
    再看特殊权限位中的3位,由于setuid、setgid、sticky分别是高、中、低3位,那么其对应的八进制表示就是4000、2000、1000。
    通过上面的介绍,举例来解释下。文件如果设置了4721权限,表示设置了setuid位,同时文件属主拥有读写执行权限,文件的属组成员拥有写权限,其他人拥有执行权限。7542则表示设置了setuid、setgid、sticky位,同时文件属主拥有读和执行权限,文件属组成员拥有读权限,其他人拥有写权限。

    mode的助记表示法
    更改文件的权限,使用chmod命令,查看用户权限可以使用ls –l命令,这2中命令都接受助记表示法。
    助记表示法,简单的说就是,用 u 代表文件属主(user),用 g 代表属组(group),用字母 o 代表其他人(other),用a代表所有人(all)。用 r 代表读权限(read),用 w 代表写权限(write),用 x 代表执行权限(execute)。用加号 + 表示给文件增加权限,用减号 - 表示给文件减少权限,用等号 = 表示给文件直接赋予某些权限。如下面这些例子:
u+w        为文件的属主添加写入权限
ug=rw,o=r 赋予属主和属组读取写入权限,赋予其他人读取权限
a-x        删除全部3种类别用户的执行权限
g=u        让属组的权限跟属主的权限完全一样。
    剩下3个特殊权限该怎么表示呢?
    用s表示setuid和setgid位,用t表示sticky位。当给属主增加s权限的时候(即 u+s),就表示设置了setuid位,在展现时属主组的x权限会被s权限代替。当给属组增加s权限的时候(即 g+s),就表示设置了setgid位,在展现的时候属组组的x权限会被s权限代替。当增加t权限的时候(即 +t 或者 o+t),即设置了sticky位,在展现的时候其他人组的x权限会被t权限代替。如:
[oracle@perf_digital tmp]$ mkdir st
[oracle@perf_digital tmp]$ ll
drwxr-xr-x 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod u+s st
[oracle@perf_digital tmp]$ ll
drwsr-xr-x 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod g+s st
[oracle@perf_digital tmp]$ ll
drwsr-sr-x 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod +t st
[oracle@perf_digital tmp]$ ll
drwsr-sr-t 2 oracle dba 4096 Oct 10 00:14 st
    如果设置了setuid、setgid或sticky中的一个,但是又没有设置相应的执行权限,那么这些位显示为S或T。接着上面的例子请看:
[oracle@perf_digital tmp]$ chmod u-x st
[oracle@perf_digital tmp]$ ll
drwSr-sr-t 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod g-x st
[oracle@perf_digital tmp]$ ll
drwSr-Sr-t 2 oracle dba 4096 Oct 10 00:14 st
[oracle@perf_digital tmp]$ chmod o-x st
[oracle@perf_digital tmp]$ ll
drwSr-Sr-T 2 oracle dba 4096 Oct 10 00:14 st

    文件属性的相关命令
    使用ls –l命令查看相关权限位和文件的归属关系和属组信息。
    使用chmod命令来更改文件的权限位信息。
    使用chown命令来更改文件的归属关系和属组信息。
    使用chgrp命令来更改文件的属组信息。
具体这几个命令的详细用法,请查阅相关资料。
    在linux系统中,系统自动跟踪文件的修改时间戳、链接数目(可使用ls –i命令查看)和文件大小信息的变化。但是,文件的权限位、归属关系和属组权只有当它们分别采用chmod、chown、chgrp命令修改时才会改变。

    umask:分配默认的权限
    用户可以使用内建的shell命令umask来影响分配给新创建文件的默认权限。umask用一个三位数字八进制形式来指定,这个值代表要“剥夺”的权限。当创建文件的时候,它的权限就设置为创建程序请求的任何权限去掉umask禁止的权限。
    创建普通文件的时候的默认权限为 666-umask ,而创建目录文件时候的默认权限为 777-umask。举例如下:
[oracle@perf_digital tmp]$ umask
0022
[oracle@perf_digital tmp]$ touch a
[oracle@perf_digital tmp]$ mkdir b
[oracle@perf_digital tmp]$ ll
total 12
-rw-r--r-- 1 oracle dba     0 Oct 10 00:34 a
drwxr-xr-x 2 oracle dba 4096 Oct 10 00:34 b

    额外的标志
    Linux的ext2和ext3文件系统定义了一些补充属性,您可以打开它们来请求获得特殊的文件系统语义。但是这些标志不能用于ext*系列以外的其他文件系统,所以linux使用了特殊命令lsattr和chattr来查看或者改变它们。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux用户文件权限管理是Linux系统非常重要的一部分,它可以帮助用户对文件和目录进行管理和保护。Linux系统,每个文件和目录都有一个所有者和一个所属组,用户可以通过设置文件和目录的权限来控制其他用户对它们的访问权限Linux系统权限分为读、写、执行三种,用户可以根据需要设置不同的权限。此外,Linux系统还有一些特殊权限,如SUID、SGID和Sticky Bit等,它们可以帮助用户更好地管理文件和目录。 ### 回答2: Linux是一种广泛使用的开源操作系统,具有强大的用户文件权限管理功能。用户文件权限管理是指对系统文件和目录进行访问控制和权限设置的过程。 在Linux,每个用户都拥有自己的用户账号,每个账号都有一个唯一的用户名和用户ID。用户可以通过登录系统来访问文件和执行操作。每个用户都有自己的用户目录,该目录通常包含用户个人文件和配置文件Linux使用权限模型来控制文件和目录的访问权限权限分为读取(r)、写入(w)和执行(x)三种。对于每个文件和目录,都有一个所有者和一个相关组。所有者可以设置自己对文件的访问权限,相关组可以授予特定组成员特定权限,其他非所有者或组成员的用户被视为其他用户,权限文件的特定模式来定义。 用户可以使用“chmod”命令来修改文件和目录的权限。该命令以数字形式表示权限,例如,数字4表示读取权限,数字2表示写入权限,数字1表示执行权限。用户可以将这些数字组合起来来设置文件和目录的权限,如“chmod 755 filename”表示给所有者分配读取、写入和执行权限,给相关组和其他用户分配读取和执行权限。 另外,Linux还使用访问控制列表(ACLs)来细粒度地控制文件和目录的访问权限。ACLs允许用户设置更多的访问规则和用户级别的权限控制。用户可以使用“setfacl”命令来设置ACLs。 总而言之,Linux用户文件权限管理功能非常灵活和强大。用户可以通过设置权限来保护文件的机密性和完整性。此外,用户还可以通过使用ACLs来进行更细粒度的权限控制。这些功能使得Linux成为一个安全、可靠的操作系统。 ### 回答3: Linux用户文件权限管理是指在Linux系统,对用户的文件进行权限的管理和控制。每个用户在Linux系统都有一个独立的用户目录,该目录下存放着该用户的个人文件。以下是关于Linux用户文件权限管理的一些重要内容。 首先,每个用户在Linux系统都有一个用户名和用户ID(UID),通过UID来唯一标识该用户。每个用户在系统有一定的权限,可以对自己的文件进行读写、执行等操作。 其次,Linux系统通过权限位对文件进行权限管理。每个文件都有其所有者、所属组和其他用户这三种角色,对应用于文件的不同权限权限位包括读(r)、写(w)、执行(x)等,分别表示对文件的读取、写入和执行权限。通过chmod命令可以修改文件权限。 此外,还有特殊权限位,如SUID、SGID和Sticky位。SUID权限表示当一个用户执行具有SUID权限文件时,该文件运行时会临时获取文件所有者的权限,用于一些需要特殊权限的程序。SGID权限表示当一个用户创建新文件时,该文件会继承所属组的权限,用于团队协作开发。Sticky位用于目录,表示只有目录的所有者才能删除或改名目录文件。 另外,还可以通过用户组的方式进行权限管理。用户可以属于一个或多个用户组,同一用户组的成员可以共享某些文件权限。通过chgrp命令可以修改文件的所属组。 最后,管理员拥有最高的权限,可以对所有文件进行管理。管理员可以创建、修改和删除用户,对用户文件权限进行管理。 总之,Linux用户文件权限管理是通过用户ID、权限位、特殊权限位和用户组来实现对用户文件权限控制。这种灵活的权限管理方式,保证了文件的安全性和隐私,并提供了良好的用户管理环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值