这段时间在工作中需要完成一个作业提交与调度系统。在使用Slurm开源框架时总是会出现各个文件的权限问题,故准备在这个地方好好整理一下权限的设置。

查看文件(目录)的权限

想要查看文件权限的话,可以使用ls -ld <目录名>来查看目标目录的权限信息。使用ls -l可以在当前路径下查看里面所有信息的权限(包括文件和路径,但不包括子路径里面的文件)。

下面是一个简单的权限显示信息:

drwxr-xr-x    8 Kaster  staff     256   5    8    2024    assets
-rw-r--r--    1 Kaster  group    1234   5    8    2024   filename

最左边的参数代表的是文件类型和权限。第一个字符代表文件类型。常用的是: - 普通文件, d 目录, l 符号链接。以第一行的目录为例:

  • 第一列的九个字符:表示文件的权限,分为三组,分别对应文件所有者(user)、所属组(group)和其他用户(others)。每组三个字符,分别表示读(r)、写(w)和执行(x)权限。 如果没有相应的权限,则用-表示。比如,drwxr-xr-x
  • 第二列的数字表示的是硬链接的数量。
  • 第三列和第四列的 Kaster staff代表文件所有者和所属的组。
  • 第五列的256是asset的目录大小。
  • 第六到八列代表的是目录最后修改时间,会根据格式不同显示不同的形式。
  • 最后一列则是目录的名称

修改文件(目录)的权限

chmod可以给文件和目录修改权限。下面是常用的几种选项

  • -R 递归地修改目录及其子目录和文件的权限。
  • -v 显示详细的输出,列出每个被修改权限的文件。
  • -c 只在权限被实际修改时才显示输出。

当后面需要修改权限时,chmod提供了两种模式

  1. 符号模式,用字符表示用户类别、操作符和权限类型

    1. 用户类别
      1. u: user (所有者) - 文件/目录的所有者。
      2. g: group (所属组) - 文件/目录所属的用户组。
      3. o: others (其他用户) - 既不是所有者,也不是所属组成员的其他用户。
      4. a: all (所有用户) - 代表 ugo 的总和。
    2. 操作符
      1. +: 添加权限 - 在现有权限的基础上添加新的权限。
      2. -: 移除权限 - 从现有权限中移除指定的权限。
      3. =: 设置权限 - 将权限设置为指定的值,覆盖原有的权限。
    3. 权限类型
      1. r: read (读取) - 允许读取文件内容或列出目录内容。
      2. w: write (写入) - 允许修改文件内容或在目录中创建/删除文件。
      3. x: execute (执行) - 允许执行文件 (如果是程序) 或进入目录 (如果是目录)。
      4. X: execute only if directory or already executable (特殊执行权限) - 只对目录或已经是可执行的文件添加执行权限。这在批量修改权限时非常有用,避免误将文本文件等设置为可执行。
      5. s: setuid 或 setgid (特殊权限) - 设置用户ID或组ID。
      6. t: sticky bit (特殊权限) - 粘滞位。
      7. l: lock (特殊权限, 较少用) - 锁。

    比如 chmod u+x filename.txt就是给filename.txt的所有者添加执行权限。

  2. 数字模式,使用三个八进制数字来表示所有者、所属组和其他用户的权限。每个数字都是 0-7 的值,代表 rwx 权限的组合。

    1. 八进制数字的含义
      1. 第一个数字: 代表 所有者 (user) 的权限。
      2. 第二个数字: 代表 所属组 (group) 的权限。
      3. 第三个数字: 代表 其他用户 (others) 的权限。
    2. 每个数字的构成
      1. r(read): 对应数字4
      2. w(write): 对应数字2
      3. x(execute): 对应数字1
    3. 计算八进制数字: 将需要的权限对应的数字相加。
      1. rwx (读、写、执行) = 4 + 2 + 1 = 7
      2. rw- (读、写,无执行) = 4 + 2 + 0 = 6
      3. r-- (只读,无写和执行) = 4 + 0 + 0 = 4
      4. --x (无读和写,只有执行) = 0 + 0 + 1 = 1
      5. --- (无任何权限) = 0 + 0 + 0 = 0
    4. 此外,还会有第四位数字作为特殊权限使用,一般用不上
      1. 4: setuid (SUID) - 设置用户ID。当可执行文件设置了 SUID 位后,其他用户执行该文件时,会暂时拥有文件所有者的权限来执行。
      2. 2: setgid (SGID) - 设置组ID。对于文件: 类似于 SUID,执行时暂时拥有文件所属组的权限。对于目录: 在目录下创建的新文件或子目录会继承该目录的组ID,而不是创建者的默认组ID。
      3. 1: sticky bit (粘滞位) - 主要用于目录。当目录设置了粘滞位后,只有文件所有者、目录所有者或 root 用户才能删除或重命名目录内的文件。

更改文件(目录)的所有者

chown (change owner)命令可以更改文件(目录)的所有者和所属的组,一般来说直接更改当前文件或者-R递归更改当前的目录。

然后就可以在以 用户名:组名的形式对文件(目录)进行更改。

例如: sudo chmod root:root filename.txt就是将filename.txt的所有者更改为root用户和root组。