前言

为什么是文件的权限?

因为: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

第一个数字用来表示SUIDSGIDSBIT

第二个数字用来表示所属用户U

第三个数字用来表示所属组G

第四个数字用来表示其他用户O

以数字的形式代替 rwxst 权限
  • r:4
  • w:2
  • x:1
  • SUID:4
  • SGID:2
  • SBIT:1
文件和目录创建时的默认权限

计算公式:文件或目录的最高权限 - UMASK默认值 = 文件或目录创建时的默认权限

出于安全考虑,文件默认都不提供执行权限,文件的最高权限为666,也就是rw-rw-rw-

目录需要可以进入,因此需要有执行权限,目录的最高权限为777,也就是rwxrwxrwx

计算UMASK创建默认权限,一般只看最后三位数字(除了特殊需求)

  • 文件创建时默认权限
    • 666 - 022 = 644
      • 因此 root 用户创建的文件,默认权限为rw-r--r--
    • 666 - 002 = 664
      • 因此普通用户创建的文件,默认权限为rw-rw-r--
  • 目录创建时默认权限
    • 777 - 022 = 755
      • 因此 root 用户创建的目录,默认权限为rwx-r-x-r-x
    • 777 - 002 = 775
      • 因此普通用户创建的目录,默认权限为rwxrwxr-x
权限控制 之 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/

参考文档:

Linux SetUID(SUID)文件特殊权限用法详解

Linux SetGID(SGID)文件特殊权限用法详解

Linux Stick BIT(SBIT)文件特殊权限用法详解

Linux umask详解:令新建文件和目录拥有默认权限

文件权限管理

Linux chown 命令

Linux chmod命令

Linux chgrp 命令

隐藏权限 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

参考文档:

Linux chattr 命令详解

(总结)Linux的chattr与lsattr命令详解

第五段:SELINUX 和 ACL 权限
  • .:表示有 SELINUX 安全上下文,没有 ACL 权限
    • SELINUX 开启时创建的安全上下文,在 SELINUX 被关闭后依然存在,不会被删除
    • SELINUX 被关闭后创建的文件或目录,不再显示.
  • +:表示有 ACL 权限,至于有没有 SELINUX 安全上下文,需要使用 ls -Z 命令查看了
SELINUX

一般情况下,咱都是关闭 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

参考文档:

ACL权限是什么,Linux ACL访问控制权限(包含开启方式)

Linux ACL权限设置(setfacl和getfacl)

第六段:链接数
  • 针对目录类型文件
    • 表示拥有多少个 一级子目录
    • 看到的数值需要减去两个
      • 使用 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 {} \;
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐