在Linux中,我们常用ls这个命令来查看文件的属性,比如使用ls查看/tmp下面的文件如下图,就会发现这些文件属性的显示多种多样,这些都代表什么意思?这次就介绍一下linux目录下文件的权限

本文共分为4部分介绍:

1:文件的基本权限

2:文件的隐藏权限

3:文件的特殊权限

4:文件的访问控制列表

Linux 文件目录权限_第1张图片

文件的基本权限

首先来介绍下文件的基本权限,比如上图中的第二个文件b,查看这个文件的属性可以看到分为7段显示下面就介绍这7段分别代表的意思

1:drwxrwxrwx :文件的权限

2:3代表的是文件的连接数

3:root代表该文件的属主为root这个用户

4:root代表该文件的属组为root这个用户组

5:4096代表该文件的大小

6:Mar 5 12:54代表的是该文件最后的修改时间

7:b代表该文件的文件名

下面重点介绍第一段,也就是drwxrwxrwx.代表的意思,可以看到这一共有11个字符,这11个字符又可分为5段,即:d     rwx      rwx       rwx      .  

第5段” .”留待后面介绍,前面4段代表的意思分别为

1:d,这个字符代表这个文件的类型

若是d则代表是目录

若是-则代表是文件

若是l则代表是连接文件

若是b则表示设备文件里面的可供存储的接口设备

若是c则表示设备文件里面的串行端口设备,如键盘,鼠标等

234:可以看到这三段均显示为rwx

2代表该文件属主(文件所有者,用 u表示即 user)的权限

3代表该文件属组(文件所属的用户组 ,用g表示即group)的权限

4代表其他用户(用o表示即other)的权限

r代表可读,用数字4表示

w代表可写,用数字2表示

x代表可执行,用数字1表示

根据上面的显示,b这个文件所有用户都有可读写并执行的权限,而hello这个文件的权限则是一个普通文件,属主可读写执行,属组可以读可执行,而其他用户则没有任何权限


现在,我们知道了Linux文件系统内文件的三种身份(文件所有者,文件所属用户组和其他人),而且知道这三种身份分别有r,w,x的权限,那么对于linux中的普通文件和目录来说,这三种权限又分别代表什么意思呢?

权限对普通文件的重要性:

文件是包含数据的地方,包括一般的文本文件,数据库内容文件,二进制的可执行文件,因此权限对于文件来说,它的意义如下:

r:可以读取此文件的实际内容,如读取文本文件的文字内容

w:可以编辑文件内容,可以删除文件内容,但不包含删除该文件

x:可以执行该文件,在Linux中文件是否可以被执行就与该权限有关而与扩展名无关,当然为了方便我们辨别文件类型,还是建议带上文件扩展名


权限对目录的重要性:

文件是存放实际数据的所在,而目录的主要内容是记录文件名列表。文件名与目录有强烈的关联,因此权限对于目录来说,它的意义如下

r:表示具有读取目录结构列表的权限,比如你可以使用ls命名将该目录的内容列表显示出来,但是仅有该权限时无法cd到该目录中去。

w:目录的可写权限是很强大的,它代表你具有更改该目录结构列表的权限,如:新建文件或目录,删除已经存在的文件或目录(即使对那个文件来说你没有任何权限),重命名已经存在的文件及目录,移动该目录中文件的位置等

x:目录的可执行权限就代表你是否可以进入该目录成为你的工作目录,如cd到该目录中。


权限介绍完了,那我们如何设置文件或目录的权限呢,下面这个例子帮助我们创建文件并更改权限,同时让我们清楚这些权限的作用,我们将会进行如下步骤

1:使用root用户在/tmp这个目录下创建一个目录ptest,并在该目录下创建一个test文件,查看ptest与test的权限

p_w_picpath

2:可以看到上面ptest和test的own都为root,现在更改这两个文件的所属组,在我的系统中,已经建好了一个用户组mygrp,下面就将ptest及test的所属组更改为mygrp,可以使用chgrp命令,用法为 chgrp [-R] 组名称 文件或目录。

Linux 文件目录权限_第2张图片

3:那如何更改文件的owner呢?我们就要用到chown这个命令,同时这个命令还能更改文件的属组,我们将上面两个文件的own更改为hadoop,同时group更改回root

Linux 文件目录权限_第3张图片

那如果现在仅想将用户的group更改为mygrp的话怎么办呢?试试看吧

Linux 文件目录权限_第4张图片

4:下面我们就要更改文件的权限,使用chmod这个命令

常用选项:-R:进行递归更改,表示连同子目录下的所有文件都会更改

前面已经介绍过文件有r w x这三种权限,分别用数字4 2 1表示,而用户身份分别用u,g,o表示,用a则代表所有用户,那么我们在更改文件的权限时就可以使用如下方式


Linux 文件目录权限_第5张图片

5:下面我们设置ptest及test的权限如下图,现有账号hadoop,hive和usertest,其中hadoop和hive都属于mygrp这个组,现在来看下这三个账号分别对ptest和test的权限

p_w_picpath

usertest对这两个文件的权限

Linux 文件目录权限_第6张图片

hive对这两个文件的权限

Linux 文件目录权限_第7张图片

hadoop的权限

Linux 文件目录权限_第8张图片


文件的隐藏权限

linux系统中文件的隐藏权限对于文件的安全性有很大帮助,不过只能在ext2和ext3上使用,下面就介绍下隐藏权限的设置与查看方式

chattr:设置文件的隐藏权限

方法:chattr  [-RV][+-=] [ASacdistu] filename

R:递归处理所有的文件及子目录

V:详细显示修改内容并打印输出

+:增加某一个特殊参数,其他原本存在的参数则不动

-:删除某一个特殊参数,其他原本存在的参数则不动

=:更改为后面的参数

A:当设置了这个属性后,当你访问这个文件或目录时,它的访问时间将不会被修改,可避免I/O较慢的机器过度访问磁盘,这对速度较慢的机器有帮助

S:一般的文件是异步写入磁盘的,如果架上这个属性,当你进行任何文件的修改时将会同步写入磁盘

a:设置了这个属性后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root能设置该属性

c:设置这个属性后,将会自动将此文件压缩,读取时自动解压缩

d:当dump程序被执行时,设置该属性的文件将不会被dump备份

i:设置这个属性的文件将不能被删除,改名,设置连接也无法写入或添加数据,只有root能设置该属性

s:设置该属性的文件,如果该文件被删除,它将会被完全从这个硬盘空间中删除

u:与s相反,设置该属性的文件,如果文件被删除,则数据内容其实还存在磁盘中,可以找回。


lsattr查看文件的隐藏属性

Linux 文件目录权限_第9张图片


文件的默认权限


文件的特殊权限

我想上面的这个例子应该已经能让你了解rwx这三个权限分别对于目录和文件的意义。相信细心的人应该也已经发现了本文第一幅中fstab,issue等文件第一段属性居然出现了S,s,T等符号,那这些又代表什么意思呢?下面就介绍一下文件的特殊权限suid,sgid和sticky

大家都知道,linux中每个账号都可以更改自己的密码,我们是通过/usr/bin/passwd 来更改密码,密码是保存在/etc/shadow这个文件中,那我们先看看这两个文件的属性

p_w_picpath

/etc/shadow这个文件只有root用户可以强制写入,而普通账号是没有权限的,那普通账号是怎么更改的自己的密码呢?这就是SUID的功能了,过程是这样的,拿hadoop这个账号来说,hadoop对文件/usr/bin/passwd聚具有执行的权限,hadoop在执行passwd这个文件时会暂时拥有root的权限,而/etc/shadow可以被root强行写入,那么hadoop就可以更改自己的密码。也就是说:

SUID权限仅对二进制程序有效

执行者对于该二进制程序需要具有x的可执行权限

该执行权限仅对在执行该程序的过程中有效

执行者将临时具有该执行程序owner的权限

同样是/etc/shadow, 普通用户是没有查看权限的,那如果我们将cat添加上suid是否就可以查看了呢?试试看

1:copy/bin/cat到/tmp目录中,查看/tmp/cat属性

p_w_picpath

2:切换到hadoop,使用/tmp/cat查看/etc/shadow

p_w_picpath

3:切换到root用户,添加SUID给/tmp/cat

p_w_picpath

4:切换回hadoop,使用/tmp/cat查看/etc/shadow。

Linux 文件目录权限_第10张图片

现在就可以打开查看了,原因就是因为我们给/tmp/cat添加了SUID,hadoop在查看/etc/shadow时暂时调用了root的身份。另外需要注意的是:SUID仅用在二进制程序上而不能用在shell script上。SUID对于目录也是无效的。


当s在group位置时就称为SGID,同SUID一样,SGID仅对二进制程序有效,执行此程序时,其进程的属组不再是运行者本人所属的基本组,而是此程序文件的属组,。

除了二进制程序之外,SGID也能够用在目录上,当一个目录设置了SGID的权限后,它将具有如下功能:

用户若对于此目录具有r x的权限时,该用户能够进入该目录

用户在此目录下的有效用户组将会变成该目录的用户组

若用户在此目录下有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同


而SBIT目前只针对目录有效,一般与SGID结合使用

当用户对此目录具有w x权限,即具有写入的权限时:

当用户在该目录下创建文件或目录时,仅有root与自己才有权利删除该文件。


下面使用一个例子说明SGID和SBIT的用法我们将做如下操作。

1:目前我们已经有用户hadoop和hive,他们同属于组mygrp,在/tmp下新建目录test,设置其所属组为mygrp,分别使用hadoop和hive在test下新建文件。修改对方所创建的文件

Linux 文件目录权限_第11张图片

可以看到hadoop和hive都可以在test目录创建文件,但是不能更改对方所创建文件内容,却又可以删除对方所创建的文件

Linux 文件目录权限_第12张图片

2:切换到root用户,添加SGID给/tmp/test,然后再分别使用hadoop和hive在test下新建文件。修改对方所创建的文件

p_w_picpath

现在发现,test目录添加SGID权限后创建的文件默认所属组为mygrp,hadoop和hive可以更改对方所创建的文件,也可以删除对方所创建的文件

Linux 文件目录权限_第13张图片

3:切换到root用户,添加SBIT给/tmp/test,然后再分别使用hadoop和hive在test下新建文件。修改对方所创建的文件.删除对方创建的文件

p_w_picpath

这次发现,hadoop和hive可以更改对方所创建的文件,但是不可以删除对方所创建的文件虽然他们两个对test这个目录都有w的权限。

Linux 文件目录权限_第14张图片

4:切换到root,看看root对这两个文件的权限

Linux 文件目录权限_第15张图片

现在明白SGID和SBIT的作用了吧,在linux中,root的权限是顶天的,那如果不想让root删除的话怎么办呢?试试我们前面提到的隐藏属性吧。


除了上面设置特殊权限的放发,文件的特殊权限也可以通过数字来设置

SUID=4

SGID=2

SBIT=1

这就是为什么你在看umask时为何会看到4为数字了,我们同样可以像设置文件普通权限的方式设置特殊权限

p_w_picpath

Linux 文件目录权限_第16张图片

在本文的第一幅图片中,细心的你也会注意到特殊权限有S和s,有T和t,什么原因呢?那就是,如果原来的位置有x的权限则为s或t,如果没有x则为S或T。


文件的访问控制列表

前面我们提到了文件的普通权限,隐藏属性及特殊权限,发现都无法针对单一用户或组设定特定的权限需求,那真的就没有办法了吗?别担心,Linux已经为我们考虑周全,可以使用ACL。ACL是Access Control List的缩写,ACL可以针对单一用户,单一文件或目录来进行r w x的权限设置。

由于ACL是传统的Unix-Like操作系统权限的额外支持,因此要使用ACL必须要有文件系统的支持,查看文件系统是否支持ACL,可以使用mount查看,一般情况下额外挂载的文件系统默认不支持ACL,如果需要有下面的方法:

1:挂载的时候设置支持ACL,mount -o acl DEVICE MOUNT_POINT,但这种挂载重启后则失效,要想永久有效:需要编辑/etc/fstab,在挂载选项后附加acl选项;

Linux 文件目录权限_第17张图片

2:设定分区的默认挂载选项中有acl,则挂载时无须再指定acl;tune2fs -o acl DEVICE  
     取消此默认挂载选项:tune2fs -o ^acl DEVICE

Linux 文件目录权限_第18张图片


接下来,就可以设置ACL了,这里介绍2个命令

setfacl:设置某个目录/文件的ACL,设置方法如下

设置ACL

setfacl -m u:USERNAME:MODE filename: 为USERNAME指定的用户设定对文件/path/to/somewhere具有MODE访问权限;

setfacl -m g:GROUPNAME:MODE  filename: 为GROUPNAME指定的组设定对文件/path/to/somewhere具有MODE访问权限;

取消ACL

setfacl -x u:USERNAME filename

setfacl -x g:GROUPNAME filename


getfacl:取得某个文件/目录的ACL设置项目  方法:getfacl filename

下面2个示例,文件添加ACL后,ls时会在第一段最后显示一个+,如本文第一幅图片中的a

Linux 文件目录权限_第19张图片

Linux 文件目录权限_第20张图片