linux chmod 参数

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 参数 正文

chmod (Change Mode) 是 Linux/Unix 系统中用于修改文件或目录权限的核心命令,理解它的参数是掌握 Linux 权限管理的关键。

chmod 命令有两种主要的修改权限的方式:

  1. 符号模式:使用 whooperatorpermission 的组合来直观地修改权限。
  2. 绝对模式:使用八进制数字来精确地设置权限。

下面我们分别对这两种模式进行详细说明。


符号模式

符号模式的语法结构是:chmod [who][operator][permission] file...

who (对象)

指定要修改权限的用户类别。

符号 类别 说明
u user 文件所有者
g group 文件所属组
o others 其他用户(既不是所有者,也不属于所属组)
a all 所有用户(u + g + o 的简写)

operator (操作符)

指定要执行的操作。

符号 说明
添加 指定的权限
移除 指定的权限
设置 仅有指定的权限(会覆盖原有权限)

permission (权限)

指定要添加、移除或设置的权限。

符号 权限 对文件 对目录
r 可以查看文件内容 可以列出目录中的文件列表
w 可以修改、删除文件内容 可以在目录中创建、删除、重命名文件
x 执行 可以运行文件(如脚本、程序) 可以进入目录(cd
s SUID/SGID 特殊权限,稍后详述 特殊权限,稍后详述
t Sticky Bit 无意义 特殊权限,稍后详述

绝对模式

绝对模式使用 3 位或 4 位八进制数字来表示权限,每一位数字都对应一组权限的累加。

权限对应的数值

权限 数值 说明
r (读) 4 Read
w (写) 2 Write
x (执行) 1 eXecute
(无权限) 0 No permission

用户类别对应的位

用户类别
u (所有者) 第一个八进制数字
g (所属组) 第二个八进制数字
o (其他用户) 第三个八进制数字
a (所有用户) 通常不直接对应一个位,而是用 ugo 的和表示

如何组合

将用户类别的权限数值相加,就得到了对应的八进制数字。

权限组合 计算方式 八进制数字 含义
0 + 0 + 0 0 无任何权限
--x 0 + 0 + 1 1 仅执行
-w- 0 + 2 + 0 2 仅写
-wx 0 + 2 + 1 3 写和执行
r-- 4 + 0 + 0 4 仅读
r-x 4 + 0 + 1 5 读和执行
rw- 4 + 2 + 0 6 读和写
rwx 4 + 2 + 1 7 读写执行

常用的绝对模式组合

八进制数字 含义
755 所有者 rwx (7),所属组 r-x (5),其他用户 r-x (5),最常见的可执行文件或目录权限。
644 所有者 rw- (6),所属组 r-- (4),其他用户 r-- (4),最常见的普通文件权限。
777 所有人都有 rwx 权限。极其危险,应尽量避免使用。
600 所有者 rw- (6),所属组和其他用户无任何权限,常用于配置文件。

特殊权限

除了基础的 rwx,还有三个重要的特殊权限。

权限 八进制 作用 示例
SUID 4 Set User ID,当一个可执行文件设置了 SUID,任何用户执行该文件时,都会暂时获得该文件所有者的权限。 /usr/bin/passwd 命令,普通用户可以修改自己的密码,就是因为这个命令有 SUID 权限,它会以 root 身份运行。
SGID 2 Set Group ID,对文件:执行者会获得文件所属组的权限,对目录:在此目录下创建的新文件,会自动继承该目录的所属组。 用于团队项目目录,确保新文件都属于同一个组。
Sticky Bit 1 粘滞位,只对目录有效,一个用户可以删除或重命名一个目录中的文件,仅当该文件是该用户自己的,或者是该目录的所有者。 /tmp 目录,任何用户都可以在 /tmp 创建文件,但只有文件所有者或 root 才能删除自己的文件。

如何设置特殊权限?

  • 符号模式:直接在权限前加上特殊权限字母。
    • SUID: chmod u+s file
    • SGID: chmod g+s directory
    • Sticky Bit: chmod +t directory
  • 绝对模式:在正常的 3 位数字前加上特殊权限的数字。
    • 4755 -> SUID + rwxr-xr-x
    • 2775 -> SGID + rwxrwxr-x
    • 1777 -> Sticky Bit + rwxrwxrwx

其他重要参数

参数 全称 说明
-R--recursive Recursive 递归地修改权限,会作用于指定目录及其下的所有子文件和子目录。使用时务必小心!
-v--verbose Verbose 显示详细的操作过程,即哪些文件的权限被修改了。
-c--changes Changes 类似 -v,但只显示被实际修改了权限的文件。
-f--silent--quiet Silent 忽略大部分错误信息,例如尝试修改一个你没有权限读取的文件的权限。

实践示例

假设我们有以下文件和目录:

$ ls -l
total 8
-rw-r--r-- 1 alice staff  0 Jan 1 10:00 document.txt
drwxr-xr-x 2 alice staff 160 Jan 1 10:01 my_project/

示例 1:使用符号模式

  • 让所属组对 document.txt 有写权限

    chmod g+w document.txt

    结果:-rw-rw-r--

  • 移除其他用户对 document.txt 的读权限

    chmod o-r document.txt

    结果:-rw-rw----

  • 让所有用户对 my_project 目录都有执行权限

    chmod a+x my_project

    结果:drwxr-xr-x (执行权限已经是 x,所以无变化)

    chmod a+wx my_project # 让所有用户都有写和执行权限

    结果:drwxrwxr-x

  • 仅设置文件所有者为读写执行,其他人无权限

    chmod u=rwx,go= document.txt

    结果:-rwx------

示例 2:使用绝对模式

  • 设置 document.txt644 权限

    chmod 644 document.txt
  • 设置 my_project 目录为 775 权限

    chmod 775 my_project
  • 递归地将 my_project 目录及其所有内容设置为 755

    chmod -R 755 my_project/

    警告-R 会递归修改,请确保你理解其影响,避免错误地修改系统文件。

示例 3:设置特殊权限

  • my_script 设置 SUID 权限

    chmod u+s my_script
    # 或者用绝对模式
    chmod 4755 my_script

    检查权限:ls -l my_script,如果所有者的执行位是 s 而不是 x,表示成功,如果是 S (大写),表示执行位没有被设置。

  • shared_dir 设置 SGID 权限

    chmod g+s shared_dir
    # 或者用绝对模式
    chmod 2775 shared_dir
  • public_tmp 设置 Sticky Bit 权限

    chmod +t public_tmp
    # 或者用绝对模式
    chmod 1777 public_tmp

    检查权限:ls -ld public_tmp,如果其他用户的执行位是 t 而不是 x,表示成功,如果是 T (大写),表示执行位没有被设置。

希望这份详细的解释能帮助你完全掌握 chmod 命令!

-- 展开阅读全文 --
头像
cardboard镜片参数具体指哪些?
« 上一篇 昨天
DataWorks调度参数如何动态配置与传递?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]