Linux 权限概述
本文主要介绍linux的:
- 文件权限
- 目录权限
- 默认权限 umask
- 隐藏权限 lsattr chattr
- 特殊权限 suid sgid sbit
- ACL 权限
本文不是零基础权限讲解,而是介绍并列出权限的种类和使用方法,讲解使用权限时哪些地方容易出错,更加详细的使用方法请查阅 man 手册。
权限的表现形式
# 使用 ls -l 可以看出更多文件信息
drwxr-xr-x 26 root root 4096 12月 20 18:03 ../
-rw-r--r-- 1 root root 70 12月 15 23:03 1.txt
# 第一个字符 d 表示是一个目录 - 表示是一个文件
- rw- r-- r-- 1 root root 70 12月 15 23:03 1.txt
1 2 3 4 5 6 7 8 9 9 9 10
1- 文件类型
2- 文件拥有者权限
3- 文件所属组权限
4- 其他用户对此文件的权限
5- 文件的连接数
6- 文件拥有者的名称
7- 文件所属组的名称
8- 文件大小,默认单位是字节(B)
9- 文件创建或最后修改的日期
10- 文件名
权限的识别
我们来看2 3 4段,分别为:
rwx r-x r--
用户 组 其他人
r = 读权限 w = 写权限 x = 执行权限
三段的顺序不会变分别是用户的读写执行权限、组的读写执行权限、其他人的读写执行权限。
横杠 - 表示没有权限。
权限的修改
有三个命令可以用来修改权限
- chgrp 修改所属的用户组权限
- chown 修改拥有者的权限
- chmod 修改读写执行的权限
# 范例:
chgrp [-R] 组名 文件或目录
chown [-R] 拥有者名称 文件或目录
chown [-R] 拥有者:组 文件或目录 #拥有者和组一起修改
chmod [-R] 权限 文件或目录
# -R 表示递归的连同目录内的一层层权限全部修改
chgrp users test.sh # 将 test.sh 文件的所属组改为 users 组
chown sftp test.sh # 将 test.sh 文件的拥有者改为 sftp 用户
chown root:sftp test.sh # 将 test.sh 文件的拥有者改为 root 组改为 sftp
chmod 777 test.sh # 将文件 test.sh 用户、组、其他人的读写执行权限改为rwx
chmod a+x test.sh # 另一种方法, 将 test.sh 添加可执行权限
注意
目录与文件读写执行权限的不同意义
文件的读写执行权限
- r (read): 表示可以读取文件内容,如cat、vi 这个文件
- w (write): 表示可以编辑修改文件内容,不包含删除文件
- x (execute): 表示文件可以被系统执行
目录的读写执行权限
- r (read): 表示目录结构可以列出来,相当于用ls查看目录下的文件或别的目录
- w (write): 表示可以修改目录结构,比如:新建、改名、删除、移动文件后目录
- x (execute): 表示可以进入该目录,用 cd xxx 进入xxx目录
如果都不能cd进该目录,那么在该目录下的新建、修改、删除等操作就会出问题
所以目录一般都会加上 x 权限
文件的默认权限
当你在创建新的文件或文件夹时默认的权限是什么呢?
一般情况下创建目录时是777权限,创建文件时是666权限
然后在根据 umask 的值进行计算,这个值是一个掩码会改变 777 或 666 的值
- 当你输入 umask 时可以查看他的值
默认情况下普通用是 0002 ,root用户是 0022 - 可以用 umask 0222 这个方法修改,重启机器后还原成原来的值
可以把这条命了输入到启动文件内让他重启生效,例:/etc/bashrc 或 ~/.bashrc
文件的隐藏权限
linux 用 chattr 和 lsattr 分别来控制文件的隐藏属性,隐藏属性能更好的控制文件的使用
chattr 命令
# 修改文件的隐藏属性
# 命令格式
chattr [ -RVf ] [ -v version ] [ mode ] files...
# 简单用法
chattr [+-=] [aAcCdDeijsStTu] 文件或目录
chattr +i test
chattr -i ~/test
# 参数
-R:递归地改变指定目录下文件的属性。此选项忽略符号链接;
-V:显示命令执行的详细信息;
-f:大部分错误信息不输出;
-v:设置文件版本号;
+:在原有参数设定基础上,追加参数;
-:在原有参数设定基础上,移除参数;
=:更新指定参数设定
改变的属性和含义,在不同的文件系统中这些属性的数量可能不相同,含义是一样的
属性 | 含义 |
---|---|
a | append only,只允许向文件追加数据,不允许删除和修改文件内容。如果目录有具有这个属性,系统将只允许在目录下简历和修改文件,不允许删除任何文件。只有root才能设置该属性 |
c | compress,自动将文件压缩,在读取时自动解压缩 |
d | No dump,在进行文件系统备份时,dump指令忽略此文件 |
e | extent format,在ext文件系统中,表示该文件使用区段(extents)映射磁盘上的块 |
i | immutable,不允许对文件进行任何的修改。对于目录而言,只能修改目录之下的文件,不允许建立和删除文件。只有root能设置此属性 |
j | journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效 |
s | secure deletion,系统在删除文件时,使用0填充文件所在的区域 |
t | no tail-merging,文件拥有t属性时,与其它文件合并时末端不会存在局部块碎片 |
u | undeletable,与s相反,删除文件时,文件内容其实还存在磁盘中,以便以后能够恢复删除的文件 |
A | Atime,不能修改文件的最后访问时间 |
D | 如果一个目录设置了D属性,任何改变将同步到磁盘;这等价于mount命令中的dirsync选项,同步目录 |
S | Sync,一旦应用程序对文件执行了写操作,则立刻将改动同步到磁盘 |
T | 目录设置T属性,Orlov块分配器将该目录视为目录层次结构的顶部,提示块分配器该目录下的子目录是无关的,将被分散的分配 |
- chmod 和 chattr 的不同在于前者是用户相关的读写执行等,后者是系统底层对文件的操作
lsattr 命令
# 查看文件的隐藏属性
# 命令格式
lsattr [ -RVadv ] [文件或目录]
# 简单用法
lsattr
-------------e-- ./图片
-------------e-- ./视频
-------------e-- ./over
-------------e-- ./模板
-------------e-- ./音乐
# 参数
-R:递归列出子目录及其文件的属性
-V:显示lsattr版本信息
-a:显示所有隐藏的文件属性
-d:如果是目录,则只显示目录本身的属性,而非目录内的文件名
-v:显示文件版本号
文件的特殊权限
linux 还有三个特殊权限位是为了解决不同需求产生的
显示在 rwx 中以 s 或 t 的形式
ls -ld /tmp
drwxrwxrwt 10 root root 4096 12月 22 23:17 /tmp
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 5月 17 2017 /usr/bin/passwd
x 位让 s 或 t 替换了,这就说明文件有 SetUid SetGid StickyBit 权限
suid
- 出现在拥有者的 x 位上
- 只可用在二进制文件,对目录无效
- 执行者对该文件有 x 的权限
- 只可用在执行过程中,在执行时执行者变成文件的拥有者执行,然后在变回来
sgid
- 出现在用户组的 x 位上
- 可以对二进制文件有效,也可对目录有效
- 对于文件
- 执行者需要有 x 权限
- 执行者在执行时获得该用户组的身份
- 对于目录
- 执行者需要有 r 和 x 的权限
- 执行者在此目录下的有效组会变成该目录的组
- 执行者在此目录下具有 w 权限时,那么执行者创建的新文件的组与此目录的组相同
sbit
- 出现在其它人的 x 位上
- 只针对目录有效,对文件无效
- 执行者对此目录需要有 w 和 x 权限
- 执行者在此目录创建的文件和目录,只有自己和root才有权限删除
如果 s 或 t 变成了大写
- 这种情况是,执行者对该目录不具备 x 或 r x 或 w 这样的相应权限。
SUID SGID SBIT 的设置
与 rwx 的设置相似,看看例子就会明白了
- 4 suid
- 2 sgid
- 1 sbit
- 4 + 2 + 1 = 7
chmod 4755 目录或文件
chmod 7666 目录或文件
# 上面这样设置会出现大写的 S 或 T 因为x位没有权限
chmod u=rwxs 目录或文件
chmod g+s, o+t 目录或文件
ACL 权限指南
- ACL 是 Access Control List 的缩写
- 为了解决 owner group others 的读写执行之外特殊情况而设定的
- 可以针对外来用户对文件的权限做特殊的设置
- 针对组也可以做同样的特殊设置
- 可以设置默认对该文件的特殊设置
- 也就是说:给 others 之外的用户对该文件或目录的读写执行的特权
ACL 权限的支持
- ACL 权限是linux额外的支持项目,所以要有文件系统支持并开启才能使用
- 一般现在主流文件系统都默认开启 ACL 权限支持
查看 ACL 权限是否开启
dumpe2fs -h /dev/sda1
# 其中有一行,可以看出 acl 是开启的状态
Default mount options: user_xattr acl
手动开启 ACL 权限
# 可以重新挂载加入 acl 权限
mount -o remount, acl /
# 上面是将根目录添加acl权限重新挂载
# 或者修改fstab让它开机挂载是启用acl,修改fstab一定要小心
vi /etc/fstab
uuid.... / ext4 defaults, acl 0 0
# 将acl写在defaults后面即可,用逗号分隔开
ACL 权限的设置
- getfacl 查看某个文件或目录的acl设置项目
- setfacl 设置某个文件或目录的acl权限
setfacl 的使用
setfacl [-bkRd] [{-m|-x} acl 参数] 文件或目录
# 参数说明
# -m 设置后面的acl参数给文件或目录,不能与 -x 合用
# -x 删除后面的acl参数, 不能与 -m 合用
# -b 删除文件或目录的所有acl权限
# -k 删除默认acl权限
# -R 递归设置
# -d 设置默认acl权限,只对目录有效
getfacl 的使用
getfacl 文件或目录
# 用来查看文件或目录的acl权限设置
# 详细使用请查看 man 文档
范例:
# 创建文件 aclfile 然后 ll 查看
touch aclfile
ll aclfile
-rw-r--r-- 1 root root 0 12月 30 00:15 aclfile
# 添加acl后在 ll 查看
setfacl -m u:root:rwx aclfile
-rw-rwxr--+ 1 root root 0 12月 30 00:15 aclfile*
# 会看到权限位后面多了一个 + 号,表面有acl权限,用getfacl查看如下
getfacl aclfile
# file: aclfile # 显示文件名
# owner: root # 显示文件的拥有者
# group: root # 显示文件的组
user::rw- # 显示文件的 user 权限
user:root:rwx # 针对root用户设置了rwx权限,当然用户是你想给的other之外的人
group::r-- # 显示文件的 group 权限
mask::rwx # acl 权限的有效范围,你设置的要 与上 mask 才是最后的权限
other::r-- # 显示文件的 other 权限
# 其实意思就是说将某个用户让他对该文件有独立的某个权限
# 针对用户组设置
setfacl -m g:root:rx aclfile
getfacl aclfile
# file: aclfile
# owner: root
# group: root
user::rw-
user:root:rwx
group::r--
group:root:r-x # 将额外的用户组对该文件有 读 执行 的权限
mask::rwx
other::r--
# mask 的说明
# 修改mask的值
setfacl -m m:r aclfile
getfacl aclfile
# file: aclfile
# owner: root
# group: root
user::rw-
user:root:rwx #effective:r--
group::r--
group:root:r-x #effective:r--
mask::r-- # mask的值修改成只读了,上面两个注释是系统自动产生的
other::r--
# 意思就是最大权限只能设置成 r-- ,而你对用户设置成rwx对组设置成r-x是不行的
# 你设置的和mask值 与 运算之后,最后只能是读的权限了
结束