在Linux中,我们常用ls这个命令来查看文件的属性,比如使用ls查看/tmp下面的文件如下图,就会发现这些文件属性的显示多种多样,这些都代表什么意思?这次就介绍一下linux目录下文件的权限
本文共分为4部分介绍:
1:文件的基本权限
2:文件的隐藏权限
3:文件的特殊权限
4:文件的访问控制列表
文件的基本权限
首先来介绍下文件的基本权限,比如上图中的第二个文件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的权限
2:可以看到上面ptest和test的own都为root,现在更改这两个文件的所属组,在我的系统中,已经建好了一个用户组mygrp,下面就将ptest及test的所属组更改为mygrp,可以使用chgrp命令,用法为 chgrp [-R] 组名称 文件或目录。
3:那如何更改文件的owner呢?我们就要用到chown这个命令,同时这个命令还能更改文件的属组,我们将上面两个文件的own更改为hadoop,同时group更改回root
那如果现在仅想将用户的group更改为mygrp的话怎么办呢?试试看吧
4:下面我们就要更改文件的权限,使用chmod这个命令
常用选项:-R:进行递归更改,表示连同子目录下的所有文件都会更改
前面已经介绍过文件有r w x这三种权限,分别用数字4 2 1表示,而用户身份分别用u,g,o表示,用a则代表所有用户,那么我们在更改文件的权限时就可以使用如下方式
5:下面我们设置ptest及test的权限如下图,现有账号hadoop,hive和usertest,其中hadoop和hive都属于mygrp这个组,现在来看下这三个账号分别对ptest和test的权限
usertest对这两个文件的权限
hive对这两个文件的权限
hadoop的权限
文件的隐藏权限
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查看文件的隐藏属性
文件的默认权限
文件的特殊权限
我想上面的这个例子应该已经能让你了解rwx这三个权限分别对于目录和文件的意义。相信细心的人应该也已经发现了本文第一幅中fstab,issue等文件第一段属性居然出现了S,s,T等符号,那这些又代表什么意思呢?下面就介绍一下文件的特殊权限suid,sgid和sticky
大家都知道,linux中每个账号都可以更改自己的密码,我们是通过/usr/bin/passwd 来更改密码,密码是保存在/etc/shadow这个文件中,那我们先看看这两个文件的属性
/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属性
2:切换到hadoop,使用/tmp/cat查看/etc/shadow
3:切换到root用户,添加SUID给/tmp/cat
4:切换回hadoop,使用/tmp/cat查看/etc/shadow。
现在就可以打开查看了,原因就是因为我们给/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下新建文件。修改对方所创建的文件
可以看到hadoop和hive都可以在test目录创建文件,但是不能更改对方所创建文件内容,却又可以删除对方所创建的文件
2:切换到root用户,添加SGID给/tmp/test,然后再分别使用hadoop和hive在test下新建文件。修改对方所创建的文件
现在发现,test目录添加SGID权限后创建的文件默认所属组为mygrp,hadoop和hive可以更改对方所创建的文件,也可以删除对方所创建的文件
3:切换到root用户,添加SBIT给/tmp/test,然后再分别使用hadoop和hive在test下新建文件。修改对方所创建的文件.删除对方创建的文件
这次发现,hadoop和hive可以更改对方所创建的文件,但是不可以删除对方所创建的文件虽然他们两个对test这个目录都有w的权限。
4:切换到root,看看root对这两个文件的权限
现在明白SGID和SBIT的作用了吧,在linux中,root的权限是顶天的,那如果不想让root删除的话怎么办呢?试试我们前面提到的隐藏属性吧。
除了上面设置特殊权限的放发,文件的特殊权限也可以通过数字来设置
SUID=4
SGID=2
SBIT=1
这就是为什么你在看umask时为何会看到4为数字了,我们同样可以像设置文件普通权限的方式设置特殊权限
在本文的第一幅图片中,细心的你也会注意到特殊权限有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选项;
2:设定分区的默认挂载选项中有acl,则挂载时无须再指定acl;tune2fs -o acl DEVICE
取消此默认挂载选项:tune2fs -o ^acl DEVICE
接下来,就可以设置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