2

Linux 下的权限是一个很常用也很有用的东西, 细分开来是分为文件权限和访问控制。文件权限就是表示文件所属用户、用户所在组、其它用户的读写和执行权限;访问控制列表又称为 ACL,主要目的是提供传统的文件权限之外的具体权限设置,可以针对单一用户或组来设置特定的权限。

文件权限

文件读写权限

文件属性字段总共有 10 个字母组成,第一个字母表示文件类型,如果这个字母是一个减号,则说明该文件是一个普通文件。字母 d 表示该文件是一个目录。后面的 9 个字母为该文件的权限标识,3 个为一组,分别表示文件所属用户、用户所在组、其它用户的读写和执行权限;例如:

vagrant@homestead:~/code$ ll -a
drwxrw-r--  1 vagrant vagrant 4096 Dec  8 09:09 blog/

表示这是一个文件夹,该文件夹对拥有者 vagrant 这个用户可读写可执行;对 vagrant 所在的组 vagrant 可读可写;对其它用户只可读;可以通过这张图加深理解:

更改读写权限

更改权限的方法是使用 chmod 命令,更改读写权限有两种方法,一种是字母方式,一种是数字方式。

  1. 字母方式
chmod userMark (+|-) PermissionsMark

其中 userMark 表示是给文件所有者、所有者组还是其他添加权限,取值如下:

u: 用户(user)
g: 组(group)
o: 其它用户(other)
a: 所有用户(all)

其中 permissionMark 表示是添加什么权限,取值如下:

r:  读
w: 写
x: 执行

例如:

chmod a+x main         对所有用户给文件 main 增加可执行权限
chmod g+w blogs        对组用户给文件 blogs 增加可写权限
  1. 数字方式

数字方式直接设置所有权限,相比字母方式,更加简洁方便;使用三位数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如 6(4+2) 代表有读写权,7(4+2+1) 有读、写和执行的权限。其实就是二进制转换为十进制的表示,比如我们要把一个文件权限改为 rwx rw- r--的话,那么其对位过来的二进制就是 111 110 100,每三位一组转换成十进制就是 764

rwx rw- r--
111 110 100
 7   6   4

那么操作命令就是:

chmod 764 main     将 main 的权限设置为 rwx rw- r--

用户与组操作

附上一些常用的用户与组的操作:

groups                       查看当前用户组
usermod -G sunny docker      将用户sunny加入docker组
usermod -g sunny docker      将用户sunny加入到docker组,并从原有的组中除去
more /etc/group              查看所有的用户组及权限
more /etc/passwd             查看所有用户及权限

访问控制列表(ACL)

要使用 ACL 必须要有文件系统支持才行,目前绝大多数的文件系统都会支持,EXT3 文件系统默认启动 ACL 的,ACL 就是可以设置特定用户或者用户组对于一个文件/文件夹的操作权限。

使用场景

假设我们当前有这样的一个文件:

[sunny@localhost ~]$ ls -l
-rw-rw---- 1 sunny admin 0 Jul 5 08:45 test.txt

test.txt 这个文件的所有者(user)是 sunny 拥有读和写的
权限。 他所属组 admin 组的用户(group)拥有读和写权限。其他任何用户(other)
对于文件没有任何的权限。

如果我们现在希望 john 这个用户也可以对 test.txt 文件进行读写操作。那么大概会想到
以下几种办法 (假设 john 不属于 admin 组)

  • 给文件的 other 类别增加读和写的权限,这样由于 john 会被归为 other 类别,那么

他也将拥有读写的权限

  • 将 john 加入到 admin 组,那么 john 会被归为 group 类别,那么他将拥有读写的权限

第一种做法的问题在于所有用户都将对 test.txt 拥有读写操作,显然这种做法不可取。第二种做法的问题在于john被赋予了过多的权限,所有属于 admin 组的文件,john 都可以拥有其等同的权限了。

看来好像都没有一个很好的解决方案,其实问题就出在 Linux 文件权限里面,对于 other 的定义过于广泛,以至于很难把权限限定于一个用户身上,那么 ACL 就是用来帮助我们解决这个问题的。

命令操作

ACL 的操作总共有这几个命令:getfacl setfacl,先来看看命令语法:

setfacl [-bkRd]  [-m|-x acl参数]  目标文件名

命令的参数含义:

-b   表明有两个 ACL 需要修改,前一个 ACL 是文件的 ACL,后一个是目录的默认 ACL
-d   设定目录的默认 ACL,这个选项是比较有用,如果指定了目录的默认 ACL,在这个目录下新建的文件或目录都会继承目录的 ACL
-R   删除文件的acl
-D   删除目录的默认 ACL,是 `-d` 的反向操作
-B   删除文件和目录默认的 ACL,是 `-b` 的反向操作
-r   递归地修改文件和目录的 ACL 权限
-l   列出文件和目录的 ACL 权限

-m  设置目标文件的 ACL 参数,不可与 `-x` 一起使用
-x  删除目标文件的 ACL 参数,不可与 `-m` 一起使用

其中 acl参数 格式是这样的:

tag:name:permission
  1. tag 可以是下面形式的一种:
user|u      表示用户的 ACL 条目
group|g     表示用户组的 ACL 条目
other|o     表示其它的 ACL 条目,即没有在 ACL 指定的用户和组的 ACL 条目
mask|m      表示掩码的 ACL 条目,在指定其它非用户属主的 ACL 权限时,这个掩码条目必须被指定,否则命令会出错
  1. name 可以是用户名或组名。不指定默认是给文件或目录的属主或用户组指定 ACL 权限,当然 name 也可以是用户的 uid 或者组的 gid
  2. permission 是指该用户或组所具有的权限,它是由 rwx 组成的一个字符串

命令实例

setfacl -m u:sunny:rwx ./wwwdir  

给用户 sunny 添加一个当前下 wwwdir 这个文件夹 rwx 的权限

setfacl -m g:sunny:rwx ./wwwdir  

给 sunny 组添加一个当前下 wwwdir 这个文件夹 rwx 的权限

setfacl -x g:sunny:rwx ./wwwdir  

删除 sunny 组下 wwwdir 这个文件夹 rwx 的权限

不难,很简单。

欢迎关我的个人公众号:左手代码


wh469012917
331 声望25 粉丝