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 命令,更改读写权限有两种方法,一种是字母方式,一种是数字方式。
- 字母方式
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 增加可写权限
- 数字方式
数字方式直接设置所有权限,相比字母方式,更加简洁方便;使用三位数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过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
- tag 可以是下面形式的一种:
user|u 表示用户的 ACL 条目
group|g 表示用户组的 ACL 条目
other|o 表示其它的 ACL 条目,即没有在 ACL 指定的用户和组的 ACL 条目
mask|m 表示掩码的 ACL 条目,在指定其它非用户属主的 ACL 权限时,这个掩码条目必须被指定,否则命令会出错
- name 可以是用户名或组名。不指定默认是给文件或目录的属主或用户组指定 ACL 权限,当然 name 也可以是用户的 uid 或者组的 gid
- 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 的权限
不难,很简单。
欢迎关我的个人公众号:左手代码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。