文件系统权限
每一个文件或者目录被创建的时候,都赋予了一些权限,例如读权限或者是写权限,通过这些权限,可以限制文件可以被哪些人访问,提高文件系统的安全。一般情况下,文件和目录都有三种权限分别是:读权限(read)、写权限(write)和执行的权限(execute)。
例如:
1 2 3 |
[normal@study ~]$ touch test.txt #创建普通文件 [normal@study ~]$ ls -l test.txt #查看文件信息 -rw-rw-r--. 1 normal normal 0 Jan 4 14:15 test.txt |
重点是第一列,它显示的是文件的权限设置。
- -rw-rw-r–
第一个-(横杠)并不是权限位的一部分,它表示这个文件是一个普通文件。除去第一个部分的横杠,权限位一共有9个,全部填满是(rwx)(rwx)(rwx),一个括号表示一种用户,表示任何人对这个文件都有读写执行的权限。文件的权限可以对三种用户分别进行设置,这三种用户是:
- 文件所有者
- 组成员
- 其他用户
也就是说,可以针对上面三种用户分别设置不同的权限。文件所有者一般是指创建该文件的用户;而同一组的成员对文件拥有同等级的权限,其他用户是指除文件所有者和组成员之外的其他账号。
权限的表现形式
除了使用字母表示文件的权限外,还可以使用数字表示;读权限(r)对应数字4,写权限(w)对应数字2,执行权限(x)对应数字1。如果一个文件任何人可读、写和执行,则这个文件的权限是777。
umask和文件/目录权限
完整的权限是777,实际上,新创建的文件和目录并不是这个权限,例如:
1 2 3 |
[normal@study ~]$ ls -l test.txt; ls -ld testdir -rw-rw-r--. 1 normal normal 0 Jan 4 14:15 test.txt drwxrwxr-x. 2 normal normal 6 Jan 4 14:54 testdir |
test.txt和testdir分别是一个普通文件和一个目录,使用数字表示,它们的权限分别是664和775,很明显,一部分权限被操作系统拿掉了,那么应该拿掉什么权限,操作系统是根据什么决定的呢?答案是umask值。在终端中直接输入umask命令就可以查询当前系统设置的umask值:
1 2 |
[normal@study ~]$ umask 0002 |
umask是多少(最大值是4+2+1三者的组合),那么操作系统就拿掉什么权限,例如当前umask值是0002,即其他用户的写权限被拿掉,除了第一个位置外,其他三个位置分别对应上面的文件所有者、组成员、其他用户权限位。第一个位置是粘着位,具有特殊意义。
umask值0002和目录创建的权限可以相互对应,因为777拿掉其他用户的写权限就是775,但是和文件的权限对不上号。原因在于,执行权限对于文件具有特殊意义,它决定文件是否可以运行,通常可执行文件是一个应用程序或者shell脚本,如果所有文件都可以执行,会对操作系统的安全造成影响,所以普通文件的执行(x)权限会被拿掉。
另外,root用户的umask值和普通用户的umask值也不同,root用户的umask值是0022,组成员的写权限也被拿掉。
普通文件和目录的权限对比
文件的读权限和写权限
文件的读写权限是针对文件内容而设置的,对这个文件具有读权限和写权限,说明你可以读取这个文件的内容和对这个文件的内容进行增加或删除操作,但是你能不能删除一个文件,由目录权限决定。
目录的读权限和写权限
由于Linux下面,一切皆文件,所以目录也是一个文件,它保存的是目录中的文件名称。如果你对一个目录有读权限,你就可以读取到目录中有什么文件。
写权限则是一个不能单独存在的权限,它必须依赖于目录的执行权限。如果你对目录拥有写权限,你可以对目录进行下面的操作:
- 往目录添加新文件或目录
- 删除目录中的文件
- 更改目录里面的文件名称
- 移动目录中文件的位置
重点是:你必须同时拥有这个目录的执行权限。执行权限决定你是否可以进入一个目录(cd到这个目录);即使你拥有目录的写权限,但没有目录的执行权限(x),这个写权限等于作废。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
[normal@study ~]$ mkdir testdir #创建一个空的目录 [normal@study ~]$ ls -ld testdir #查看目录信息 当前用户对目录有rwx权限 drwxrwxr-x. 2 normal normal 6 Jan 4 16:41 testdir [normal@study ~]$ touch testdir/sample.txt #成功往目录写文件 [normal@study ~]$ ls -l testdir total 0 -rw-rw-r--. 1 normal normal 0 Jan 4 16:42 sample.txt [normal@study ~]$ chmod u-x testdir #拿掉当前用户对目录的执行权限 [normal@study ~]$ ls -ld testdir drw-rwxr-x. 2 normal normal 24 Jan 4 16:42 testdir #虽然依然拥有目录的写权限,但是没有了执行权限 #用户依然不能往目录添加文件 [normal@study ~]$ touch testdir/smaple2.txt touch: cannot touch ‘testdir/smaple2.txt’: Permission denied #同样地,没有了执行权限,也无法删除目录中的文件 [normal@study ~]$ rm testdir/sample.txt rm: cannot remove ‘testdir/sample.txt’: Permission denied #最后,也不能重命名目录中的文件名 [normal@study ~]$ mv testdir/sample.txt testdir/smaple mv: failed to access ‘testdir/smaple’: Permission denied #因为目录可读,因此能列出里面的文件名 [normal@study ~]$ ls testdir ls: cannot access testdir/sample.txt: Permission denied sample.txt #没有执行权限,连文件的详细属性也不能查询 #显示的是一连串问号 [normal@study ~]$ ls -l testdir ls: cannot access testdir/sample.txt: Permission denied total 0 -????????? ? ? ? ? ? sample.txt |
更改文件和目录的权限
操作系统提供了几个改变文件权限的命令,它们是chmod、chown,chgrp
chmod
它的作用是更改文件和目录的权限(rwx),语法是:
- chmod [ugoa][+-=][perms]
u表示用户所有者, g代表组成员,o表示其他人,而a则表示all,即所有人。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#创建测试文件 [normal@study ~]$ touch sample.txt [normal@study ~]$ ls -l sample.txt -rw-rw-r--. 1 normal normal 0 Jan 4 17:07 sample.txt #为文件所有者添加执行权限 [normal@study ~]$ chmod u+x sample.txt [normal@study ~]$ ls -l sample.txt -rwxrw-r--. 1 normal normal 0 Jan 4 17:07 sample.txt #设置组成员的权限是rwx [normal@study ~]$ chmod g=rwx sample.txt [normal@study ~]$ ls -l sample.txt -rwxrwxr--. 1 normal normal 0 Jan 4 17:07 sample.txt #拿掉其他人对文件的读权限 [normal@study ~]$ chmod o-r sample.txt [normal@study ~]$ ls -l sample.txt -rwxrwx---. 1 normal normal 0 Jan 4 17:07 sample.txt |
可以全部一起设置权限:
1 2 3 |
[normal@study ~]$ chmod ugo+x sample.txt [normal@study ~]$ ls -l sample.txt -rwxrwx--x. 1 normal normal 0 Jan 4 17:07 sample.txt |
也可以分开设置:
1 2 3 |
[normal@study ~]$ chmod u-x,g-wx,o=rwx sample.txt [normal@study ~]$ ls -l sample.txt -rw-r--rwx. 1 normal normal 0 Jan 4 17:07 sample.txt |
需要注意的是, 逗号之间不能有空格,否则会出错。
chown
chown用于更换文件的所有者,命令格式:
chown owner:group filename
只有管理员权限的账号能调用这个命令,该命令可以在改变文件所有者的同时更改文件的所属组。
1 2 3 4 5 6 7 8 9 |
#把smaple.txt的所有者变为jack [root@study normal]# chown jack sample.txt [root@study normal]# ls -l sample.txt -rw-r--rwx. 1 jack normal 0 Jan 4 17:07 sample.txt #同时改变文件的所有者和所属组 [root@study normal]# chown jack:jack sample.txt [root@study normal]# ls -l sample.txt -rw-r--rwx. 1 jack jack 0 Jan 4 17:07 sample.txt |
chgrp
chgrp的使用语法基本和chown一样,例如:chgrp group_name file_name。
基于ACL的权限管理
传统的权限管理系统虽然好用,但是它有一个缺点,就是它只能针对一类人进行权限控制,例如文件所有者、组成员和其他人,如果想针对某单一用户进行权限控制,它是无法做到的。ACL全称access control list,它是为了弥补以上的不足而产生的。一般的现代unix-like操作系统都支持ACL,可以使用下面的命令查看系统是否支持:
1 2 3 |
[root@study normal]# dmesg | grep ACL [ 2.079524] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN) [ 3.110014] SGI XFS with ACLs, security attributes, no debug enabled |
使用ACL的权限控制系统,需要两个命令,一个用于设置权限,另一个是获取权限,它们是setfacl和getfacl。
setfacl命令
添加用户的ACL权限控制
通过-m参数,可以把指定的权限设置到文件中去,基本语法是:
setfacl -m u:账号名称:权限 文件名
例如:
1 2 3 4 5 6 7 |
[root@study normal]# ls -l sample.txt -rw-r--rwx. 1 jack jack 0 Jan 4 17:07 sample.txt #指定kate用户只能读取该文件 [root@study normal]# setfacl -m u:kate:r sample.txt [root@study normal]# ls -l sample.txt -rw-r--rwx+ 1 jack jack 0 Jan 4 17:07 sample.txt |
虽然原本对其他人的权限是rwx,但是当添加了acl权限之后,用户kate对文本的权限由acl控制。另一点需要注意的是,文件所在目录的权限会对文件的权限有影响,如果文件目录的权限是700,那么,即使文件对其他人是可读的,我们依然不能读取该文件的内容。
添加组的ACL权限控制
和用户权限相似,添加组的ACL权限也十分简单,语法是:
setfacl -m g:组名称:权限 文件名
1 2 |
#设置组kate中的成员对文件只读 [root@study testdir]# setfacl -m g:kate:r sample.txt |
限制文件的可用权限(mask)
当添加ACL权限的时候,文件同时拥有一个mask值,这个值和ACL权限一致。mask语法用于限制可用的权限,当有第二个添加权限的语句,mask值被更新。语法:
setfacl -m m:权限 文件名称
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#设置acl权限为rw [root@study testdir]# setfacl -m u:kate:rw sample.txt [root@study testdir]# getfacl sample.txt # file: sample.txt # owner: jack # group: jack user::rw- user:kate:rw- group::r-- mask::rw- #默认mask值和acl权限一致 other::rwx #设置mask值为r,即只读,拿掉了w权限 [root@study testdir]# setfacl -m m:r sample.txt [root@study testdir]# getfacl sample.txt # file: sample.txt # owner: jack # group: jack user::rw- user:kate:rw- #effective:r-- group::r-- mask::r-- #mask被更新 other::rwx #重新设置文件的acl权限为wx [root@study testdir]# setfacl -m u:kate:wx sample.txt [root@study testdir]# getfacl sample.txt # file: sample.txt # owner: jack # group: jack user::rw- user:kate:-wx group::r-- mask::rwx #mask值同时被更新了,保留了之前的读权限 other::rwx |
设置ACL权限继承
默认情况下,ACL权限不会被继承,它只针对当前设置的文件或目录,如果希望该目录下的新建文件或目录同时也被ACL控制,可以设置ACL权限继承,语法
- setfacl -m d:[u|g]:[用户名|组名]:permiss 文件名
例如:
1 2 |
#设置目录的ACL继承权限 [root@study]# setfacl -m d:u:jack:rw ./testdir |
设置ACL没有权限
即ACL权限为不可读、不可写和不可执行
1 |
[root@study ~]# setfacl -m u:jack:- ./testdir |
重点是权限列中的(-)横杠,这个位置不能留空。
移除文件的ACL权限
移除文件的ACL权限和上面的没有ACL权限不一样,移除权限等于删除所有文件的ACL控制,文件的权限交由传统的权限控制。
1 2 3 4 5 |
#移除文件的所有ACL权限 [root@study testdir]# setfacl -b sample.txt #移除用户kate的ACL权限 [root@study testdir]# setfacl -x u:kate sample.txt |
getfacl命令
getfacl命令用于获取文件已经设置的ACL权限
1 |
[root@study testdir]# getfacl sample.txt |
扩展权限(chattr)
文件系统还支持设置额外的文件权限,不过不同的文件系统可设置的文件权限并不完全相同。可以通过chattr
命令来设置文件的扩展权限。
和chmod一样,chattr支持的操作符有三个:+(添加)、-(减去)和=(等于),chattr的语法和chmod的语法也差不多:chattr [+-=] 文件名称。chattr可设置的值有:[aAcCdDeijsStTu]
不同的文件系统支持的选项不同,xfs支持的选项如下:
- a (append)文件只能追加内容,不能删除内容
- A 不更新文件的access time(no atime update)
- i (immutable)文件不能被修改,即使root用户也如此
- d no dump
- S 同步更新(synchronous updates)
如果希望知道文件系统支持什么选项,可以使用man 文件系统类型
命令查看,例如:
1 |
man 5 ext4 |
在FILE ATTRIBUTES一栏就有相关的资料。
设置文件权限
使用chattr命令设置文件的权限,例如如果不想文件被修改,可以如下设置(需要管理员权限)
1 |
chattr +i /etc/vimrc |
添加了该权限之后,该文件就不能被修改,否则出现permission denied错误。
查看文件的权限
chattr设置的权限不能使用ls查看,而是通过lsattr
命令
1 |
lsattr /etc/vimrc |
转载请注明:Pure nonsense » Linux权限管理