前言
Linux中的权限是相对于用户和组而言的,阅读这篇文章前请先对用户和用户组有所了解
Linux中用户及用户组的管理
权限介绍
当我们使用ls -l
时可以查看文件及目录的详细信息
这里可以看到最前面显示了一堆“drwx-…”,这其实就表示文件或目录的权限
- 第一个字符:表示文件类型
字符 | 类型 |
---|---|
- | 普通文件,类似于Windows的记事本 |
d | 目录文件,类似于文件夹 |
c | 字符设备文件,串行端口设备,顺序读写,键盘 |
b | 块设备文件,可供存储的接口设备,随机读写,硬盘 |
p | 管道文件,用于进程间的通信 |
s | 套接字文件,常用于网络上的通信 |
l | link,链接文件 |
- 第2 ~ 4个字符(rwx):该文件的属主用户对该文件的权限
- 第5 ~ 7个字符(rwx):该文件的属组用户对该文件的权限
- 第8 ~ 10个字符(rwx):其他用户对该文件的权限
- 第11个字符(.或+):表示是否存在ACL
-
表示没有该权限
用八进制表示用户权限
- r:Read读
- w:Write写
- x:execute执行
文件权限针对三类对象进行定义
- owner:属主,缩写
u
- group:属组,缩写
g
- other:其他,缩写
o
另:a
表示这三种全部(all)
对于文件和目录来说,这三个权限的意义不尽相同
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r | 可读取文件 | 列出目录的内容(文件名) |
w | 可更改文件内容 | 可创建或删除目录中的任一文件 |
x | 可作为命令执行文件 | 可访问目录的内容(取决于文件权限) |
设置文件和目录的一般权限
修改权限
命令格式1:chmod [选项] [ugoa][+-=][rwx] 文件或目录
命令格式2:chmod [选项] nnn 文件或目录
- ugoa:表示加减权限的对象
- + | - | =:表示增加、减去、赋予权限
- rwx:用字符型表示权限
- nnn:用三个八进制表示三组权限
- -R:递归指定目录及以下文件
- st:特殊权限
修改文件属主和属组
- 改变属主
命令格式:chown [选项] 新属主[:[新数组]] 被改变归属的文件或目录
-R:递归指定 - 改变属组
命令格式:chown [选项] :新属组 被改变归属的文件或目录
chgrp [选项] 新属组 被改变归属的文件或目录
特殊权限
众所周知,改密码这件事情实则是改变执行/usr/bin/passwd
改变/etc/shadow
文件,但这两个文件的拥有者都是root,那么普通用户为什么可以给自己改密码呢,这里就要用到特殊权限
可以看到,在/usr/bin/passwd
文件的所属主的权限上写的是rws
,这里的s
即为特殊权限
特殊权限共有三种:SET UID(SUID)、SET GID(SGID)、Sticky Bit(SBit粘滞位)
-
SUID:是为了让一般用户在执行某些程序时获得程序拥有者的权限(仅对二进制文件有效)
-
SGID:多用于多人开发项目
-
文件:执行时获得程序拥有者的权限
-
目录:在该目录下减文件或目录时,将会是此目录的用户组
-
-
Sticky Bit:仅对目录有效
- 在具有SBit的目录下,用户若在该目录下具有 w 及 x 权限,则该用户建立的文件只有拥有者和root用户可以删除
这三种特殊权限同样使用chmod
来施加,使用u±s
、g±s
、o±t
;若要使用nnnn
格式的话,后三位仍然是rwx
的权限八进制值,第一位则是特殊权限的八进制值
也就是说第一位的7
表示特殊权限
进程掩码 mask umask
所有文件都会有自己的权限,可是我们创建文件时一般不指定它的权限,那么它的权限是如何获得的呢,这就要收到umask
的影响
查看用户当前umask
:
在当前umask
下创建文件及目录:
修改临时的shell umask
:
永久修改umask
需要修改/etc/profile
文件:vim /rtc/profile
ACL
当一部分人既不是文件的属主,也不是属组,但希望短时间内获得与其他用户不同的权限,这是就要用到ACL
查看ACL权限:
这是可以看到权限后面有个.
设置ACL:setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
选项 | 作用 |
---|---|
-m | 设定ACL(如果给用户设置,则“u:用户名:权限 ”;如果给组设置,则“g:组名:权限 ”) |
-x | 删除指定的ACL |
-b | 删除所有的ACL |
-d | 设置默认ACl(仅对目录有效,指目录中新建立的文件拥有此默认权限) |
-k | 删除默认ACL |
-R | 递归设置ACL |
给用户和用户组设置的ACL并不是最终的ACL权限,一般默认mask
的权限都是rwx
,与我们设定的权限相与就是我们最终设定的权限
示例:创建一个/project
文件,属组里有两个用户,权限为077
[root@localhost ~]# mkdir /project
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# groupadd QQgroup
[root@localhost ~]# gpasswd -M zhangsan,lisi QQgroup
[root@localhost ~]# chown root:QQgroup /project/
[root@localhost ~]# chmod 770 /project/
[root@localhost ~]# ll -d /project/
drwxrwx---. 2 root QQgroup 6 12月 30 14:15 /project/
再设置一个旁听者pt,ACL为r-x
[root@localhost ~]# useradd pt
[root@localhost ~]# setfacl -m u:pt:rx /project/
[root@localhost ~]# ll -d /project/
drwxrwx---+ 2 root QQgroup 6 12月 30 14:15 /project/
[root@localhost ~]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: QQgroup
user::rwx
user:pt:r-x
group::rwx
mask::rwx
other::---
可以看到文件权限后的.
变成了+
,说明存在ACL
最大有效权限 mask
前面说到最终的ACL是我们设置的与mask
相与之后的的结果,因为当最大有效权限都没有,ACL即便设置了也无效
设置mask
:
[root@localhost ~]# setfacl -m m:rx /project/
[root@localhost ~]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: QQgroup
user::rwx
user:pt:r-x
group::rwx
mask::r-x
other::---
示例
/pub
目录为公共存储目录对所有用户可以读,写,执行,但用户只能删除属于自己的文件(t权限)
/sc
目录为生产部存储目录只能对生产部人员可以写入,并且生产部人员所建立的文件都自动归属到shengchan
中
admin
用户对于/sc
目录可以读,写,执行
- 创建目录
/test/data
,让it组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组,此外,每个用户仅能删除自己的文件
当文件本身不存在x
权限时,特殊权限会变成大写 - 让普通用户能使用
/tmp/cat
去查看/etc/shadow
文件
- 设置ACL权限,要求如下:
在/test/dir
里创建的新文件自动属于webs组
,组apps
的成员如:tomcat
能对这些新文件有读写权限,组dbs
的成员如:mysql
只能对新文件有读权限,其它用户(不属于webs,apps,dbs)不能访问这个文件夹。