Linux文件的权限与属性

  因为之前学习Linux的时候没有作比较全面的总结笔记,并且平时大部分工做都在windows上进行,因此关于Linux的一些知识点有所遗忘。近期可贵空闲,翻阅书籍,学习《鸟哥的Linux私房菜》,重温Linux知识,借此机会想把Linux的相关知识作一个总结笔记。首先要总结的是Linux文件相关知识——权限与属性。注意,这不是Linux入门,这是学习笔记,入门推荐《鸟哥的Linux私房菜》,讲得很详细。html

  讲解Linux文件的权限与属性,天然绕不开ls命令啦。在Linux中,咱们能够经过命令ll(即ls -l)查看当前目录下文件的权限与属性的详情列表:node

输出结果中有7个信息列,从左到右分别是:文件类型+权限、文件链接数、文件属主、文件属组、文件大小、文件最后修改时间、文件名称。好了,下面开始详细介绍每一个信息点。linux

 

1、文件权限windows

  首先要介绍的是文件权限,这在Linux中是很重要的。安全

1. 基本权限:socket

  Linux是一个多用户的操做系统,对于每个文件而言,用户的类型有三种:文件属主,即文件的建立者;文件属组,即文件所属的用户群组;其余用户。对应的,有三种用户类型对于这个文件的权限,每种用户类型的权限都有:读(r)、写(w)、执行(x)三种权限。在上面的截图的第一列信息中有十个字符,其中第一个字符表示的是文件类型,后面的9个字符从左到右分别表示属主、属组和其余用户对于文件的rwx三种权限的占位符,某个位置上有对应英文字母表示有相应权限,若是是“-”则表示没有相应权限。例如,最后一个文件“yzz”,属主和属组用户对文件有读写权限,而其余用户则只有读权限。学习

  修改文件权限能够经过chmod指令来实现,其中权限能够经过字符表示也能够经过数字来表示,比较简单,这里就再也不过多说明,使用上图“myfile”这个文件来实验,直接看实验截图,注意观察文件各个权限位的变化spa

(u表示属主,g表示属组,o表示其余用户)操作系统

  若是想要修改文件属主、属组能够经过chownchgrp来实现(注意观察第三列和第四列信息的变化):3d

2. 特殊权限:

(1)Set UID

  当s这个标志出如今文件属主的x权限位上时,此时就被称为Set UID,简称为SUID的特殊权限。SUID的限制与功能以下:

<1>SUID权限仅对二进制程式有效;

<2>执行者对该程式须要具备x的可执行权限;

<3>本权限仅在执行该程式的过程当中有效;

<4>执行者将具备该程式拥有者的权限。

如下面两个文件举例说明:

从上图能够看出,通常用户对于/etc/shadow”这个文件是没有任何权限的,只有root能够对这个文件进行修改。可是用户却可使用passwd这个指令,也就是执行“/usr/bin/passwd”这个文件经过对“/etc/shadow”进行修改来修改本身的密码。缘由就是由于“/usr/bin/passwd”这个文件具备SUID的特殊权限,通常用户执行这个文件的过程当中暂时拥有这个文件的拥有者root的权限,因此也就能够对“/etc/shadow”这个文件进行修改了。

(2)Set GID

  当s这个标志出如今文件属组的x权限位上时,称为Set GID,简称SGIDSGID不只对二进制程式有效,对于目录也是有效的。

  当SGID设置在二进制程式上时,与SUID相似地,文件的执行者在执行过程当中将暂时拥有文件属组的权限,这个在Linux中有如下两个文件可做为例子:

  当SGID设置在目录上时,具备如下特殊功能:

<1>对目录具备rx权限的用户能进入目录。

<2>使用者在此目录下的有效群组将会变成该目录的群组。

<3>对目录具备w权限的用户,在此目录下建立文件时,新文件的群组与此目录群组相同。

当某个用户组的用户想要在某个目录下共享资源的时候,SGID的第三个功能就能派上用场了。

(3)Sticky Bit

  Sticky Bit简称SBIT,目前只针对目录有效。当某个目录被设置了SBIT以后,目录的其余用户的x权限位将出现t标志,具备wx权限的用户在该目录下建立的文件或目录,只有本身和root才有权限删除。/tmp就是这样的目录:

(4)SUID/SGID/SBIT设置:

  特殊权限的设置也是使用chmod这个命令,特殊权限的表示一样可使用字符形式也可使用数字,使用数字时在表明rwx基本权限三个数字前面再加一个数字就能够了,其中4SUID2SGID1SBIT,设置实验以下:

输出结果最后一行,ST为大写时表示对应特殊权限为空,缘由是对应用户没有x执行权限。

3. 默认权限:

  在Linux中,新建的文件或目录的默认权限是由umask决定的,那么这个umask究竟是什么呢?咱们先来查看一下:

这里有两种查询方式,第二种咱们很容易明白,那第一种打印出来的那四个数字有什么意义呢?它们分别表明特殊权限(SUID/SGID/SBIT)、文件属主(u)、文件属组(g)、其余用户(o)的权限!

  那新建文件或目录的默认权限是怎么计算的呢?咱们知道新建文件默认是没有执行权限的,因此它的完整权限是rw-rw-rw-,用数字表示就是666,而新建目录默认是有执行权限的,因此它的完整权限是rwxrwxrwx,用数字表示就是777。新建文件或目录的默认权限就是使用这个三位数字表示的完整权限分别减去umask指令查询出来的后面三位数字,因此当umask0002的时候,新建文件的默认权限就是664,即rw-rw-r--,新建文件夹的默认权限就是775,即rwxrwxr-x,也就是说umask -S打印出来的结果实际上是新建目录的默认权限,新建文件的默认权限要在umask -S结果的基础上减去全部用户的x执行权限。不信咱们能够新建文件和目录来看看结果:

touchmkdir指令分别用于建立空文件和空目录)

果真,结果和咱们计算的同样!

  若是你想修改默认权限,直接使用umask指令后面接上数字来执行便可:

4. ACL细部权限设定:

  若是须要单独设置某个用户或某个群组对某个文件或某个目录的权限,则须要使用ACLAccess Control List)进行细部权限设定。可使用setfacl命令进行设置,使用getfacl命令进行查询。

(1)查看当前系统是否支持ACL

(2)设置单个用户对某个文件的权限:

(若用户名为空,则表示设置root用户对文件的权限;若设定权限为“-”则表示无权限)

(3)设置某个群组对某个文件的权限:

(4)有效权限设置:

(用户或群组所设定的权限必需要在mask的权限设定范围内才会生效)

  当使用以上命令给目录设置权限的时候,所设置的ACL权限都是没法被该目录下的子目录和文件所继承的,若想继承,则需下达命令格式为——setfacl -m d:u:帐号:权限 目录名称。若在设置目录的ACL权限时,但愿连同目录下的文件与子目录也一块儿设置则使用命令——setfacl -R u:帐号:权限 目录名称。

  设置ACL权限以后还能够移除,移除所有ACL权限使用指令——setfacl -b 文件名称,移除某个帐号的ACL权限使用指令——setfacl -x u:帐号 文件名称。

 

2、时间属性

  在Linux中,每一个文件与目录都有许多时间属性,其中有三个主要的时间属性:mtimemodification time)、atimeaccess time)、ctimestatus time),分别表示文件内容最后修改时间、文件内容最后访问时间、文件状态(例如权限、属性)最后改变时间。

  llls -l)命令默认展现的是mtime,咱们能够经过指定--time选项来查看其它两个时间属性,并且默认展现的是简写的时间,咱们能够经过指定--full-time选项来查看完整的时间:

(这里使用三个指令按顺序分别展现了mtimeatimectime

  若想修改文件的时间属性,可使用touch指令,例如咱们来修改上图的“temp”文件的时间属性(有多种选项参数,这里只展现-t选项的使用):

能够看到,文件的mtimeatime已经被咱们改成-t选项指定的时间了,可是ctime并无,而是变成了我刚刚执行这个touch命令的时间。注意,ctime的意义是文件状态的最后改变时间,这里的文件状态包括权限、属性等,咱们刚才改变了文件的mtimeatime这两个时间属性,因此文件状态的最后改变时间就是刚刚没错啊哈哈。注意,即便咱们复制一个文件的时候复制了全部的属性,也没法复制ctime这个属性的!

 

3、链接数

  llls -l)这个命令打印出来的结果中第二列数据表示的就是文件的链接数了,那么什么是文件或目录的链接数?它又是怎么计算出来的呢?这就要从硬链接和软链接提及了。因为硬链接涉及到Linux文件系统结构的问题,尤为是inodedata block的概念,因此若是不了解的能够先参考一下个人另外一篇博文——Linux的文件系统结构(如下对硬链接的讲解是创建在读者已经了解这方面知识的基础上进行的)。

  什么是硬链接呢?假设如今已有一个文件A,它的链接数是1,那么咱们能够在某个目录B下面创建文件A的硬链接C,这个创建硬链接的过程其实就是在目录Bdata block中添加一条“硬链接C的文件名到文件Ainode编号”的关联记录,仅此而已,并无真正建立新的文件。硬链接创建以后,就有两个文件名指向文件Ainode了,分别是文件A和硬链接文件C,因此文件A的链接数就变成了2,也就是说ll命令中展现的链接数实际上表示的就是硬链接数,每创建多一个硬链接,链接数就会增长1。下面咱们就使用ln这个命令来建立一个硬链接看看效果:

这里咱们建立了文件myfile的硬链接myfile2,能够看到,myfile的链接数增长了1,并且这两个文件的权限、属性都是如出一辙的,这是由于文件的权限、属性都是存储在inode中的,而这两个文件名指向的是同一个inode啊,它们的文件内容也会是相同的,实际上就是同一个文件来的。

  那软链接又是什么呢?软链接其实就相似windows中的快捷方式。假设如今已有一个文件A,咱们要在某个目录中建立文件A的软链接B,其实就是建立一个新的文件B,只是文件Bdata block中仅仅记录了文件A的路径位置,打开文件B的时候就会读取到文件A的位置而后打开文件A。咱们能够经过ln -s来建立一个软链接:

这里咱们建立了文件myfile的软链接myfile3,能够看到,软链接对源文件的链接数并无影响的,myfile3的文件大小为6个字节,这是由于它记录了源文件的名称“myfile”,6个字符,恰好6个字节!

  如今来总结一下硬链接与软链接的异同点:

(1)均可以使用ln指令来建立,只是建立软链接的时候要加上-s选项。

(2)打开硬链接和软链接最终都是打开源文件。

(3)建立1个硬链接会使源文件的链接数增长1,而建立软链接则不会。

(4)建立硬链接并不会建立新文件,而建立软链接则会新建一个文件。

(5)源文件删除以后,硬链接不会失效,而软链接会失效。

(6)硬链接不能跨文件系统,不能链接目录。

  最后补充一点,关于目录的链接数。咱们新建一个空目录的时候,目录中默认就有.”和“..”两个子目录,其中“.”目录指向了当前目录的inode,而“..”指向了上一层目录的inode。因此当咱们建立一个新的空目录的时候,它的链接数是2,而上一层目录的链接数会增长1

 

4、隐藏属性

  文件的隐藏属性主要是在系统安全方面起到做用,咱们可使用chattr命令来设置隐藏属性,而使用lsattr来查询。chattr指令的选项参数有不少,但比较经常使用的有两个:ai,这两个属性都是只有root才能设置的,设置a表示这个文件只能增长内容而不能删除也不能修改,设置i表示文件不能被删除、更名、建立链接,也没法添加内容和修改内容,反正就是不能作任何改动!下面是设置与查询操做示例:

+表示增长某个属性,-表示减去某个属性)

 

5、文件类型

  回到本文第一个llls -l)指令的截图,ll指令打印的信息中第一列第一个字符表示的就是文件类型,不一样的字符表示的文件类型不一样:

-:普通文件(包括硬链接)。

d:目录。

l:软链接。

b:区块设备文件。

c:字符设备文件。

s:资料接口文件(sockets)。

p:资料输送文件(FIFOpipe)。

可使用file指令来查看某个文件具体的文件类型:

 

6、文件大小

  llls -l)指令输出的第5列信息表示的就是文件大小,ll指令默认展现的文件大小都以byte(字节)为单位,可使用-h参数将其展现成kMG为单位的形式:

其中total 16K表示这个目录中全部文件大小总和。

  然而咱们会发现这些文件大小加起来并无达到16K这么多啊:4k+60bytes+15bytes+15bytes=4k+90bytes<16k,怎么回事呢?若是你们对Linux文件系统结构有所了解就会知道怎么回事了,一样能够参考个人另外一篇博文——Linux的文件系统结构。其实这里的16K表示的并非全部文件真实大小的总和,而是全部文件占用磁盘空间的总和,咱们知道即便一个文件很小,但它至少都会占用一个data block的。咱们能够在ll指令添加-s选项查看各个文件占用的磁盘空间大小:

4k+4k+4k+4k=16k!是的,这里的第一列表示的就是每一个文件占用的磁盘空间大小了,而第六列表示的则是每一个文件内容的真实大小。从这里也能够看出个人Linux系统的每一个data block大小为4K

 

7、文件名称

  llls -l)指令输出的最后一列信息表示的就是文件名称。其实文件名称自己并无什么好说的,只是关于文件名称引伸出来的一些问题须要记录一下。首先是隐藏文件问题,Linux的隐藏文件不像windows的隐藏文件那样须要进行属性设置的,它只是纯粹根据文件名称来决定文件是否隐藏,若文件名称以“.”开头则隐藏,不然显示。默认状况下咱们使用ls指令是查看不到这些隐藏文件的,能够加上-a选项来查看全部文件。

  另外,Linux的文件也没有什么所谓的后缀名。好比一个文件是否为执行文件,根本与它是什么后缀名不要紧,只是与文件的x执行权限有关罢了。不过咱们能够在文件名后面加上一些适当的后缀名,使得咱们能借此了解文件大概是什么内容的,只是这个后缀名没有什么实际用处就是了。

相关文章
相关标签/搜索