目录
前言
为什么是文件的权限?
因为:
Linux一切皆文件
查看文件权限
通过
ls --help
可以看到l
参数的意思是使用长列表格式
使用如下命令,以长列表格式查看根目录有哪些文件
ls -l /
lrwxrwxrwx. 1 root root 7 Mar 30 2019 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Mar 30 2019 boot
drwxr-xr-x 20 root root 3280 Feb 26 13:34 dev
drwxr-xr-x. 77 root root 8192 Mar 30 2019 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Mar 30 2019 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Mar 30 2019 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 3 root root 17 Feb 13 00:54 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x 129 root root 0 Feb 26 13:34 proc
dr-xr-x---. 2 root root 151 Mar 30 2019 root
drwxr-xr-x 24 root root 680 Feb 26 13:35 run
lrwxrwxrwx. 1 root root 8 Mar 30 2019 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Feb 26 13:34 sys
drwxrwxrwt. 17 root root 4096 Feb 26 13:35 tmp
drwxr-xr-x. 13 root root 155 Mar 30 2019 usr
drwxr-xr-x. 19 root root 267 Mar 30 2019 var
输出比较多,咱这边拿
etc
目录来做一个例子
drwxr-xr-x. 77 root root 8192 Mar 30 2019 etc
咱们对输出的内容先做一个拆分,一个个来解释说明,这里总共拆分成12段内容
d
rwx
r-x
r-x
.
77
root
root
8192
Mar 30
2019
etc
第一段:文件类型
-
表示普通文件
d
表示目录
l
表示链接文件
p
表示管道文件
b
表示块设备文件
(一般在/dev
目录下 )c
表示字符设备文件
(一般在/dev
目录下 )s
表示套接字文件
由此可以看出,我们的
etc
是一个目录类型的文件
shell 默认文件类型颜色
前提是使用
系统缺省
的配色方案
灰白色
表示普通文件
亮绿色
表示可执行文件
亮红色
表示压缩文件
灰蓝色
表示目录
亮蓝色
表示软链接文件
(文件名称后面会有-> <源文件路径>
)亮黄色
表示设备文件
第二、三、四段:UGO权限
从左往右依次为 (所属用户权限)U
(所属组权限)G
(其他用户权限)O
-
r
读取权限- 针对文件:可以查看文件内容
- 针对目录:可以查看目录下有哪些文件和目录
-
w
写入权限- 针对文件:可以修改、删除、移动
- 针对目录:可以删除、移动
-
x
执行权限- 针对文件:具有执行权限
- 针对目录:具有进入目录的权限
-
-
无权限-
举例:
-
r-x
:表示具有读取和执行权限,没有写入权限 -
rw-
:表示具有读取和写入权限,没有执行权限
-
-
-
特殊权限
SUID
:仅适用于二进制可执行文件
,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失- 所属用户权限的
x
权限位置显示为s
- 所属用户权限的
SGID
:既可以对文件进行配置,也可以对目录进行配置。默认情况下,用户创建文件时,其属组为此用户所属的基本组,一旦某目录被设定了 SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录- 所属组权限的
x
权限位置显示为s
- 所属组权限的
SBIT
:权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root 才有权利修改或删除该文件- 其他用户权限的
x
权限位置显示为t
- 其他用户权限的
UMASK 默认权限
执行
umask
命令可以看到root
用户默认的值是0022
,普通用户默认的值是0002
第一个数字用来表示
SUID
、SGID
、SBIT
第二个数字用来表示所属用户
U
第三个数字用来表示所属组
G
第四个数字用来表示其他用户
O
以数字的形式代替 rwxst 权限
r
:4w
:2x
:1SUID
:4SGID
:2SBIT
:1
文件和目录创建时的默认权限
计算公式:
文件或目录的最高权限
-UMASK默认值
=文件或目录创建时的默认权限
出于安全考虑,文件默认都不提供执行权限,文件的最高权限为
666
,也就是rw-rw-rw-
目录需要可以进入,因此需要有执行权限,目录的最高权限为
777
,也就是rwxrwxrwx
计算UMASK创建默认权限,一般只看最后三位数字(除了特殊需求)
- 文件创建时默认权限
- 666 - 022 = 644
- 因此 root 用户创建的文件,默认权限为
rw-r--r--
- 因此 root 用户创建的文件,默认权限为
- 666 - 002 = 664
- 因此普通用户创建的文件,默认权限为
rw-rw-r--
- 因此普通用户创建的文件,默认权限为
- 666 - 022 = 644
- 目录创建时默认权限
- 777 - 022 = 755
- 因此 root 用户创建的目录,默认权限为
rwx-r-x-r-x
- 因此 root 用户创建的目录,默认权限为
- 777 - 002 = 775
- 因此普通用户创建的目录,默认权限为
rwxrwxr-x
- 因此普通用户创建的目录,默认权限为
- 777 - 022 = 755
权限控制 之 chmod 命令
控制用户对文件或目录的权限
使用示例
所有人对 text.txt 文件有执行权限
如果是针对所属用户可以将
a+x
改为u+x
如果是针对所属组可以将
a+x
改为g+x
如果是针对其他用户可以将
a+x
改为o+x
chmod a+x text.txt
将
test 目录
权限修改为700
,并且递归修改子目录和目录下的所有文件(需要使用-R
参数)
chmod -R 700 test/
将 test 目录权限修改为
rwxrwx---
,并设置SGID
chmod 2770 test/
权限控制 之 chown 命令
控制用户和用户组对文件或目录的权限
有一个大前提:用户和用户组必须是存在的,如果不存在,修改权限会报错
chown: invalid user: '<用户>.<用户组>'
使用示例
语法格式:
chown <用户>.<用户组> <文件或目录>
用户和用户组中间的
点
也可以使用冒号
,两个效果是一致的(chown <用户>:<用户组> <文件或目录>
)
test.txt 文件
属于alice用户
和family 组
同样的,如果是目录,并且需要子目录和子目录下的文件拥有一样的权限,需要加上
-R
参数
chown alice.family test.txt
权限控制 之 chgrp 命令
控制用户组对文件或目录的权限
前提是
用户组
必须存在,不存在会报错chgrp: invalid group: 'test'
使用示例
语法格式:
chgrp <用户组> <文件或目录>
test 目录
属于 family 组
,并且子目录和目录下的文件
都属于 family 组
chgrp -R family test/
参考文档:
隐藏权限 chattr 命令
常用命令参数
A
:即 Atime,告诉系统不要修改对这个文件的最后访问时间。S
:即 Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。a
:即 Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。b
:不更新文件或目录的最后存取时间。c
:将文件或目录压缩后存放。d
:当dump程序执行时,该文件或目录不会被dump备份。D
:检查压缩文件中的错误。i
:即 Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。s
:彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域。u
:当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。t
:文件系统支持尾部合并(tail-merging)。X
:可以直接访问压缩文件的内容。R
:递归修改指定目录下的子目录和文件+
:在原有参数设定基础上,追加参数。-
:在原有参数设定基础上,移除参数。=
:更新为指定参数设定。
chattr 命令的用法
生成一个有内容的文件
echo 'hello world' > text.txt
只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件,不允许删除这个文件
chattr +a text.txt
查看隐藏权限
lsattr text.txt
-----a---------- text.txt
追加内容到 text.txt 文件
echo 'test' >> text.txt
删除 text.txt 文件
rm -f text.txt
rm: cannot remove ‘text.txt’: Operation not permitted
此时就会返回如下信息,不能删除
解除隐藏权限
此时再去删除文件,文件就可以被删除了
chattr -a text.txt
参考文档:
第五段:SELINUX 和 ACL 权限
.
:表示有 SELINUX 安全上下文,没有 ACL 权限- SELINUX 开启时创建的安全上下文,在 SELINUX 被关闭后依然存在,不会被删除
- SELINUX 被关闭后创建的文件或目录,不再显示
.
+
:表示有 ACL 权限,至于有没有 SELINUX 安全上下文,需要使用ls -Z
命令查看了
SELINUX
一般情况下,咱都是关闭 selinux 的,因为真的很烦,除非一些企业有特殊要求,有兴趣的,可以看推荐的文章来学习
ACL 权限控制
简而言之,ACL 权限是为了让权限配置更细化,标准的 UGO 权限比较单一,只能控制单一的用户和用户组,当一些特殊场景需要使用时,赋权就会麻烦很多,有了 ACL 权限,这个问题就被解决了
ACL 权限有两个命令
setfacl
设置 ACL 权限
getfacl
查看 ACL 权限
setfacl 常用参数
-m
:修改指定文件或目录的 ACL 权限-x
:删除指定用户或用户组的 ACL 权限-b
:删除指定文件或目录的所有 ACL 权限-d
:对目录(只能对目录操作)
设定默认 ACL 权限(目录中新建立的文件拥有此默认 ACL 权限)-k
:删除目录默认 ACL 权限-R
:递归操作,对子目录和目录下的所有文件生效
使用实例
语法格式
setfacl -m <用户u或用户组g或其他用户o>:<用户名或用户组名(所有用户留空)>:<rwx权限> <文件或目录名称>
getfacl <文件或目录名称>
查看
text.txt 文件
拥有哪些 ACL 权限
getfacl text.txt
# file: text.txt # 文件名称
# owner: root # 属于 root 用户
# group: root # 属于 root 组
user::rw- # root 用户的权限为 可读写不可执行
group::r-- # root 组的权限为 只读
other::r-- # 其他用户的权限为 只读
对
text.txt 文件
设置jack 用户
ACL 权限,权限为 rwx
(ACL 权限本身是针对某个用户或者用户组去做一些特定的赋权,因此赋权的思路和
chmod
命令是不太一样的,要做区别)
setfacl -m u:jack:rwx text.txt
对
test 目录
设置family 组
默认 ACL 权限,权限为rw-
设置默认 ACL 权限
setfacl -m d:g:family:rwx test
对
text.txt 文件
设置其他用户
ACL 权限,权限为rw-
setfacl -m o::rw- text.txt
我们来查看一下最终的 ACL 权限
# file: text.txt # 文件名称
# owner: root # 属于 root 用户
# group: root # 属于 root 组
user::rw- # root 用户的权限为 可读写不可执行
user:jack:rwx # jack 用户的权限为 可读可写可执行
group::r-- # root 组的权限为 只读
mask::rwx # mask 权限为 可读可写可执行
other::rw- # 其他用户的权限为 可读可写不可执行
# file: text.txt # 文件名称
# owner: root # 属于 root 用户
# group: root # 属于 root 组
user::rwx # root 用户的权限为 可读可写可执行
group::r-x # root 组的权限为 可读可执行不可写
other::r-x # 其他用户的权限为 可读可执行不可写
default:user::rwx # 默认 ACL 权限: root 用户的权限为 可读可写可执行
default:group::r-x # 默认 ACL 权限: root 组的权限为 可读可执行不可写
default:group:family:rwx # 默认 ACL 权限: family 组的权限为 可读可写可执行
default:mask::rwx # 默认 ACL 权限: mask 权限为 可读可写可执行
default:other::r-x # 默认 ACL 权限: 其他用户的权限为 可读可执行不可写
删除 text.txt 文件
的jack 用户
ACL 权限如果是删除文件所有的 ACL 权限,执行
setfacl -b text.txt
setfacl -x u:jack text.txt
删除
test 目录
默认 ACL 权限
setfacl -k test
参考文档:
第六段:链接数
- 针对目录类型文件
- 表示拥有多少个 一级子目录
- 看到的数值需要减去两个
- 使用
ls -la
命令可以看到,每个目录下面都会有两个隐藏目录 .
表示当前目录..
表示上一级目录- 如果是手动创建的隐藏目录,也是计算在链接数里面的
- 使用
- 针对目录类型以外的其他文件
- 表示有多少个硬链接
- 硬链接
- 通过索引节点进行的链接
- 只能在同一文件系统中的文件之间进行链接,不能对目录进行创建
- 删除硬链接对应的源文件,硬链接文件仍然存在,而且保存了原有的内容
- 硬链接源文件和硬链接文件拥有相同的 inode 号
- 软连接(又叫 符号链接)
- 软链接可对文件或目录创建
- 删除
软链接文件
并不影响被指向的文件
,但若被指向的原文件被删除,则相关软连接就变成了死链接 - 删除
软链接目录
,切记最后不能带上/
,否则会删除被指向的目录(源文件)
下的所有内容
- 硬链接
- 表示有多少个硬链接
验证 etc 目录下是不是有 77 个目录
^d
意思是以 d 开头的,目录类型的文件都是 d ,这个在第一段的时候,咱已经了解过了
ls -la /etc/ | grep '^d' | wc -l
软链接和硬链接来点示例比较直观
准备一个文件和一个带有文件和目录的目录
echo 'hard link test' > hardLinkFile.txt
echo 'soft link test' > softLinkFile.txt
mkdir -p softLinkDir/softLinkDir01
echo 'soft link test' > softLinkDir/softLinkFile01.txt
通过
ls -lR
命令来看当前路径下的文件和目录列表
hardLinkFile.txt
文件的链接数现在是1,等会我们创建一个硬链接后查看效果
.:
total 8
-rw-r--r-- 1 root root 15 Feb 26 15:36 hardLinkFile.txt
drwxr-xr-x 3 root root 53 Feb 26 15:36 softLinkDir
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile.txt
./softLinkDir:
total 4
drwxr-xr-x 2 root root 6 Feb 26 15:36 softLinkDir01
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile01.txt
./softLinkDir/softLinkDir01:
total 0
查看 root 目录的权限和链接数
-d
参数表示只看当前目录,不看目录下的内容
ls -ld /root/
这里可以看到,链接数是3,因为我们创建了一个目录,再加上
.
和..
两个目录
dr-xr-x---. 3 root root 195 Feb 26 15:36 /root/
硬链接
创建一个硬链接文件
ln hardLinkFile.txt hardLinkFile-new.txt
通过
-i
参数来查看 inode 号
ls -li hardLinkFile*
可以看到,inode 号都是 134315093,并且两个文件的链接数都是 2
134315086 -rw-r--r-- 2 root root 15 Feb 26 15:36 hardLinkFile-new.txt
134315086 -rw-r--r-- 2 root root 15 Feb 26 15:36 hardLinkFile.txt
软连接
创建一个软连接文件
-s
参数表示软连接
ln -s softLinkFile.txt softLinkFile-new.txt
查看文件
ls -l softLinkFile*
可以看到
softLinkFile-new.txt
指向了softLinkFile.txt
当我们删除
softLinkFile-new.txt
文件,不会导致softLinkFile.txt
文件小时当我们删除
softLinkFile.txt
文件,会导致softLinkFile-new.txt
文件变成红色,因为源文件已经被删除了,变成了死链接
lrwxrwxrwx 1 root root 16 Feb 26 15:39 softLinkFile-new.txt -> softLinkFile.txt
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile.txt
创建一个带文件和目录的软连接目录
ln -s softLinkDir softLinkDir-new
查看目录
ls -lR softLinkDir*/
可以看到,里面的结构和文件以及目录都是一样的
softLinkDir/:
total 4
drwxr-xr-x 2 root root 6 Feb 26 15:36 softLinkDir01
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile01.txt
softLinkDir/softLinkDir01:
total 0
softLinkDir-new/:
total 4
drwxr-xr-x 2 root root 6 Feb 26 15:36 softLinkDir01
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile01.txt
softLinkDir-new/softLinkDir01:
total 0
此时,我们只是想删除软链接文件,并且保留源文件
切记,目录名称最后的 '/' 千万别加
,等下试一下就知道了
rm -f softLinkDir-new
查看目录
ls -lR softLinkDir*/
可以看到,我们软连接的new目录没有了,但是我们的源文件还是存在的
softLinkDir/:
total 4
drwxr-xr-x 2 root root 6 Feb 26 15:36 softLinkDir01
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile01.txt
softLinkDir/softLinkDir01:
total 0
我们重新生成软链接,然后带上
/
删一次看看
ln -s softLinkDir softLinkDir-again
查看目录
ls -lR softLinkDir*/
softLinkDir/:
total 4
drwxr-xr-x 2 root root 6 Feb 26 15:36 softLinkDir01
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile01.txt
softLinkDir/softLinkDir01:
total 0
softLinkDir-again/:
total 4
drwxr-xr-x 2 root root 6 Feb 26 15:36 softLinkDir01
-rw-r--r-- 1 root root 15 Feb 26 15:36 softLinkFile01.txt
softLinkDir-again/softLinkDir01:
total 0
删除软链接文件
rm -rf softLinkDir-again/
再次查看目录
ls -lR softLinkDir*/
只剩一个源目录和软链接目录了,里面的东西都没了,所以,如果删的是软连接目录,一定要小心,小心,再小心
softLinkDir/:
total 0
softLinkDir-again/:
total 0
软链接文件和硬链接文件都有一个特性:当文件内容更新时,源文件和链接文件都会更新,修改任一一个即可
软链接目录也是一样的,当源目录或软链接目录下有新的文件或者目录生成,源目录和软链接目录都会更新并且同时存在
第七段:所属用户
文件属于哪个用户的
第八段:所属组
文件属于哪个组的
第九段:文件大小
- 针对文件
- 文件的大小,单位为字节
- 可以使用
ls -h
以可读格式查看
- 针对目录
- 目录符的大小(这一块确实不太了解,目前也没有找到这一方面的资料,如果有大佬知道,希望能赐教)
第十、十一段:修改时间和日期
- atime
access time
访问时间- 文件中的数据库最后被访问的时间
- ctime
change time
变化时间- 文件的元数据发生变化
- 比如权限,所有者等
- mtime
modify time
修改时间- 文件内容最后被修改的时间
ls -l
默认显示的 mtime可以使用
ls -l --time=ctime <文件或目录名称>
来查看ctime
可以使用
ls -l --time=atime <文件或目录名称>
来查看atime
可以使用
stat <文件或目录名称>
来同时查看atime
ctime
mtime
第十二段:文件或目录的名称
这里其实没啥好解释的,这里给一个特殊情况
很多服务器在部署的时候,字符集没有设置为 UTF-8 ,导致上传的中文文件或目录是乱码的,此时使用 rm 去删除的时候,没法复制文件或目录的名字,这里可以用上面硬链接讲到的 inode 号配合 find 命令来删除
find <查找的路径> -inum <inode号> -exec rm -rf {} \;
标签:文件,txt,哪些,ACL,ls,权限,root,目录
From: https://www.cnblogs.com/chen2ha/p/17087018.html