linux 权限不完全指南

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 = 执行权限
三段的顺序不会变分别是用户的读写执行权限、组的读写执行权限、其他人的读写执行权限。
横杠 - 表示没有权限。

权限的修改

有三个命令可以用来修改权限

  1. chgrp 修改所属的用户组权限
  2. chown 修改拥有者的权限
  3. 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 添加可执行权限

注意

目录与文件读写执行权限的不同意义

文件的读写执行权限

  1. r (read): 表示可以读取文件内容,如cat、vi 这个文件
  2. w (write): 表示可以编辑修改文件内容,不包含删除文件
  3. x (execute): 表示文件可以被系统执行

目录的读写执行权限

  1. r (read): 表示目录结构可以列出来,相当于用ls查看目录下的文件或别的目录
  2. w (write): 表示可以修改目录结构,比如:新建、改名、删除、移动文件后目录
  3. 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 位上
  • 可以对二进制文件有效,也可对目录有效
  • 对于文件
    1. 执行者需要有 x 权限
    2. 执行者在执行时获得该用户组的身份
  • 对于目录
    1. 执行者需要有 r 和 x 的权限
    2. 执行者在此目录下的有效组会变成该目录的组
    3. 执行者在此目录下具有 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值 与 运算之后,最后只能是读的权限了

结束

你可能感兴趣的:(linux 权限不完全指南)