文件权限解析
文章目录
文件权限
ls命令可以用来查看Linux系统上的文件、目录和设备的权限。
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象 的类型:
之后有3组三字符的编码。每一组定义了3种访问权限:
- r代表对象是可读的
- w代表对象是可写的
- x代表对象是可执行的
若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别.
这些权限说明登录名为rich的用户可以读取、写入以及执行这个文件(可以看作有全部权限)。 类似地,rich组的成员也可以读取、写入和执行这个文件。然而不属于rich组的其他用户只能读取 和执行这个文件:w被单破折线取代了,说明这个安全级别没有写入权限。
默认文件权限
umask命令用来设置所创建文件和目录的默认权限。
第一位代表粘着位(sticky bit)后面的3位表示文件或目录对应的umask八进制值。umask值只是个掩码。它会屏蔽掉不想授予该安全级别的权限。
八进制模式的安全性设置先获取这3个rwx权限的值,然后将其转换成3位二进制值,用一个八进制值来表示。在这个二进制表示中,每个位置代表一个二进制位。因此,如果读权限是唯一 置位的权限,权限值就是r–,转换成二进制值就是100,代表的八进制值是4。
要把umask值从对象的全权限值中减掉。对文件来说,全权限的值是666(所有用户都有读和写的权限);而对目录来说,则是777(所有用户都有读、写、执行权限)。
umask值通常会设置在/etc/profile启动文件中(参见第6章),不过有一些是设置在/etc/login.defs文件中的(如Ubuntu)。可以用umask命令为默认umask设置指定一 个新值。
文件一开始的权限是666,减去umask值022之后,剩下的文件权限就成了644。
由于目录的默认权限是777,umask作用后生成的目录权限不同于生成的文件权限。umask 值026会从777中减去,留下来751作为目录权限设置。
改变安全性设置
改变权限
chmod命令用来改变文件和目录的安全性设置。该命令的格式如下:
chmod options mode file
mode参数可以使用八进制模式或符号模式进行安全性设置。八进制模式设置非常直观,直接用期望赋予文件的标准3位八进制权限码即可。
与通常用到的3组三字符权限字符不同,chmod命令采用了另一种方法。下面是在符号模式 下指定权限的格式。
[ugoa...][[+-=][rwxXstugo...]
第一组字符定义了权限作用的对象:
- u代表用户
- g代表组
- o代表其他
- a代表上述所有
后面跟着的符号表示你是想在现有权限基础上增加权限(+),还是在现有权限基础上移除权限(-),或是将权限设置成后面的值(=)。
最后,第三个符号代表作用到设置上的权限。你会发现,这个值要比通常的rwx多。额外的设置有以下几项。
像这样使用这些权限。
$ chmod o+r newfile
options为chmod命令提供了另外一些功能。-R选项可以让权限的改变递归地作用到文件和子目录。你可以使用通配符指定多个文件,然后利用一条命令将权限更改应用到这些文件上。
改变所属关系
Linux提供了两个命令来实现这个功能:chown命令用来改变文件的属主, chgrp命令用来改变文件的默认属组。
chown命令的格式如下。
chown options owner[.group] file
可用登录名或UID来指定文件的新属主。
# chown dan newfile
chown命令也支持同时改变文件的属主和属组。
# chown dan.shared newfile
如果你不嫌麻烦,可以只改变一个目录的默认属组。
# chown .rich newfile
如果你的Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。
# chown test. newfile
chown命令采用一些不同的选项参数。-R选项配合通配符可以递归地改变子目录和文件的所 属关系。-h选项可以改变该文件的所有符号链接文件的所属关系。
只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
chgrp命令可以更改文件或目录的默认属组。
$ chgrp shared newfile
用户账户必须是这个文件的属主,除了能够更换属组之外,还得是新组的成员。
共享文件
Linux系统上共享文件的方法是创建组。
创建新文件时,Linux会用你默认的UID和GID给文件分配权限。想 让其他人也能访问文件,要么改变其他用户所在安全组的访问权限,要么就给文件分配一个包含 其他用户的新默认属组。
如果你想在大范围环境中创建文档并将文档与人共享,这会很烦琐。幸好有一种简单的方法 可以解决这个问题。
Linux还为每个文件和目录存储了3个额外的信息位。
-
设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
-
设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
-
粘着位:进程结束后文件还驻留(粘着)在内存中。
SGID位对文件共享非常重要。启用SGID位后,你可以强制在一个共享目录下创建的新文件.都属于该目录的属组,这个组也就成为了每个用户的属组。
SGID可通过chmod命令设置。它会加到标准3位八进制值之前(组成4位八进制值),或者在符号模式下用符号s。
如果你用的是八进制模式,你需要知道这些位的位置,
因此,要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID 位置位。
首先,用mkdir命令来创建希望共享的目录。然后通过chgrp命令将目录的默认属组改为包 含所有需要共享文件的用户的组(你必须是该组的成员)。最后,将目录的SGID位置位,以保证 目录中新建文件都用shared作为默认属组。
为了让这个环境能正常工作,所有组成员都需把他们的umask值设置成文件对属组成员可 写。在前面的例子中,umask改成了002,所以文件对属组是可写的。
做完了这些,组成员就能到共享目录下创建新文件了。跟期望的一样,新文件会沿用目录的 属组,而不是用户的默认属组。现在shared组的所有用户都能访问这个文件了。
文章作者 Forz
上次更新 2017-08-09