2

基本权限

Linux文件(包括目录)通过相对权限进行管理,这里的相对是指相对文件所有者,权限分为文件所有者权限(user),所有者同组用户权限(group)和其他用户权限(other),通过 ll 命令可以查看用户对文件的操作权限,权限分为r:读权限,w:写权限,x:执行权限。如:通过 ll 命令显示文件的权限为:-rwxr-xr,为便于说明,图示如下。
image.png

  • 第9位:文件类型,-表示普通文件,d表示目录,还有软连接等其他类型
  • 第6-8位:文件所有者权限
  • 第3-5位:文件所有者同组用户权限
  • 第0-2位:其他用户权限

每个类型的用户权限又可以描述为一个3位的二进制,为便于更直观说明,借网图一张。
image.png

  • r为第2位,十进制值为4
  • w为第1位,十进制值为2
  • x为第0位,十进制值为1

权限位和十进制对应如下:

  • rwx = bin(111) = 4 + 2 + 1 = 7
  • r-x = bin(101) = 4 + 0 + 1 = 5
  • r-- = bin(100) = 4 + 0 + 0 = 4

rwx 对于文件和目录的权限意义:

权限简写对普通文件的权限对目录的权限
读取Readr查看文件内容列出目录内容(ls)
写入Writew编辑文件内容添加、删除、移动(重命名)目录中的文件
执行eXecutex作为程序运行文件进入目录(cd)

umask

umask(user file-creation mode mask)为用户创建文件时的掩码,是创建文件和目录时控制默认权限的基础,如果没有设置umask,文件默认权限为0666,目录默认权限为0777。
umask的作用是在创建文件和目录时,使用“默认权限-umask值”为创建的对象设置权限,大多数Linux中的默认umask为022,则创建的文件默认权限为0666 - 022 = 0644,创建目录的默认权限为0777 - 022 = 0755

SUID、SGID和Sticky

Linux中还有三个和权限相关的属性
SUDI:Set User ID,控制位:4
SGID:Set Group ID,控制位:2
Sticky:控制位:1

SUID

该属性只对可执行文件(Shell除外)有效,执行具有SUID权限的程序时,程序将以文件所有者的权限执行,而不是启动程序的用户。比如,一个程序的所有者为root,普通用户执行该文件时,程序将以root的权限运行,程序可以访问只有root用户才有访问权限的文件,这为一些特殊场景的程序运行带来了方便,同时也存在一定的安全隐患。

在程序运行时,Linux中有两组用户权限,一组为启动程序的用户权限,另一组为执行程序的用户权限,分别说明如下:

  • effective user id:进程访问文件权限相关的UID,简写为 euid
  • effective group id:进程访问文件权限相关的GID,简写为 egid
  • real user id:创建该进程的用户登录系统时的UID,简写为 ruid
  • real group id : 创建该进程的用户登录系统时的GID,简写为 rgid
  • saved set user id:拷贝自 euid
  • saved set group id:拷贝自 egid

此属性的一个典型场景为用户修改密码使用的 /usr/bin/passwd 程序,用户修改密码时需要向 /etc/passwd/etc/shadow 写入数据,而这两个文件是只有root采用写入权限的,通过给 /usr/bin/passwd 文件设置SUID,普通用户执行此文件修改密码时,进程的 euid 为root,将获得root用户权限,可以向以上配置文件写入新密码。

SUDI通过s表示,当程序设置了SUID后,文件所有者权限的 x 位将会变为 s,如通过 ll 查看 /usr/bin/passwd 文件的权限为 -rwsr-xr-x。

SGID

对于可执行文件,该属性的作用和SUID类似,引发程序运行的权限为组用户权限,设置SGID后,组用户权限的 x 为会变为 s

对于目录,设置此属性后,会引发在此目录下创建的文件的所属组和此目录相同。

Sticky

此属性仅对目录有效,设置了Sticky属性的目录中的文件仅可被目录的所有者删除和改名,其他用户无此权限,可以防止文件误删,系统中的/tmp目录就利用了此属性。设置了Sticky后,目录的其他用户权限的 x 位将会变为 t。通过 ll 命令查看 /tmp 目录的权的权限为 drwxrwxrwt

由于SUID、SGID、Sticky都设置在 x 位上,当对应 x 位未设置时,显示位大写的 SST

chown & chmod

chown

chownchange owner 的缩写,用于设置文件的所有者和所属组,只有root用户和文件的所有者才能执行此命令,命令格式如下:

chown [-cfhvR] [--help] [--version] user[:group] file...

参数说明如下:

  • user : 新的文件所有者名称或用户ID
  • group : 新的文件所有组的名称或组ID
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • --help : 显示辅助说明
  • --version : 显示版本

修改文件的所有者和所属组命令示例如下:

chown user1:group1 file1.txt

chmod

chmodchange mode 的缩写,用于设置文件的权限,只有root用户和文件所有者才能执行此命令,命令格式如下:

chmod [-cfvR] [--help] [--version] mode file...

参数说明如下:

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
  • --help : 显示辅助说明
  • --version : 显示版本

mode 是权限设定参数,Linux提供了两种设置方法:

  1. 用户对象 + 操作模式 + 操作权限组合模式
  2. 8进制直接设置模式

用户对象 + 操作模式 + 操作权限位模式

此模式下,权限设置参数格式如下

[ugoa][[+-=][rwxXst]...][,...]
  • [ugoa]表示要操作的用户对象

    • u 表示文件所有者
    • g 表示所有者同组用户
    • o 表示其他用户
    • a 表示所有用户
  • [+-=]表示操作的方式

    • + 表示增加权限
    • - 表示取消权限
    • = 表示唯一设定权限
  • [rwxXst]表示要操作权限位

    • r 表示读取权限
    • w 表示写入权限
    • x 表示执行权限
    • X 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
    • s 设置SUID或SGID
    • t 设置Sticky位

命令示例:

  • 为所有用户添加对file1.txt文件的读权限
chmod ugo+r file1.txt
chmod a+r file1.txt
  • 将当前目录下的所有文件与子目录设置为任何人可读取
chmod -R a+r *

8进制设置模式

使用8进制模式时,用一位8进制的0-7表示一组用户的权限,如 rwx=bin(111) = 4+2+1 = 7
rwxr-x--x = *754,表示:

  • 文件所有者拥有rwx=7
  • 同组用户拥有r-x=5
  • 其他用户拥有x--=1

此模式不能使用 + - 为用户增量设置权限,而是需要一次性全部设置。
命令示例:

  • 为把file1.txt文件的权限设置为rwxr-x--x
chmod 751 file1.txt

另外SUID(4)、SGID(2)、Sticky(1)可以用第4位8进制表示(第4位未设置时可省略),如为rwxr-xr--权限的文件添加SUDI权限,则把第4为设置为4,命令为:

chmod 4754 file1.txt

乘着风
107 声望12 粉丝

五岁时,妈妈告诉我,人生的关键在于快乐。上学后,人们问我长大了要做什么,我写下“快乐”。他们告诉我,我理解错了题目,我告诉他们,他们理解错了人生。——约翰·列侬