文件&文件夹权限操作

#linux #运维

总结
  • 权限分三组:属主(u)、属组(g)、其他用户(o),每组三位:r=4、w=2、x=1
  • chmod 两种写法:符号模式(u+x)和数字模式(755
  • 目录的 x 权限代表"可进入",没有 x 就无法 cd 进去,和文件的 x 含义不同
  • chown 改属主/属组,chgrp 只改属组,批量操作加 -R 递归

1. 权限结构

0b1825c39a16c3289d90b72e01dca0e1 MD5

ls -l 输出的第一列共 10 位:

-  rwx  r-x  r--
│   │    │    │
│   │    │    └── 其他用户(o)权限
│   │    └─────── 属组(g)权限
│   └──────────── 属主(u)权限
└──────────────── 文件类型

文件类型:

符号 类型
- 普通文件
d 目录
l 软链接
c 字符设备
b 块设备

权限位含义:

符号 数字 对文件 对目录
r 4 可读取文件内容 可列出目录内容(ls)
w 2 可修改文件内容 可在目录内创建/删除文件
x 1 可执行 可进入目录(cd)
- 0 无权限 无权限

2. chmod 修改权限

2.1 符号模式

# 格式:chmod [ugoa][+-=][rwx] 文件或目录
# u=属主  g=属组  o=其他用户  a=所有(等同 ugo)
# + 添加  - 移除  = 设置为指定权限

# 给属主添加执行权限
chmod u+x script.sh

# 移除属组的写权限
chmod g-w file.txt

# 给所有人添加读权限
chmod a+r file.txt

# 设置属主 rwx,属组和其他用户只读
chmod u=rwx,go=r file.txt

2.2 数字模式

每组权限用三位数字之和表示:r=4, w=2, x=1

# 755:属主 rwx(7),属组 r-x(5),其他 r-x(5)
chmod 755 script.sh

# 644:属主 rw-(6),属组 r--(4),其他 r--(4)
chmod 644 config.txt

# 600:只有属主可读写,其他人无任何权限(私钥文件常用)
chmod 600 ~/.ssh/id_rsa

# 777:所有人可读写执行(不推荐,权限过大)
chmod 777 file

常用权限速查:

数字 权限 适用场景
755 rwxr-xr-x 可执行脚本、目录
644 rw-r--r-- 普通文件、配置文件
600 rw------- 私钥、密码文件
700 rwx------ 私有脚本
777 rwxrwxrwx 尽量避免

2.3 递归修改

# 递归修改目录及其下所有文件的权限
chmod -R 755 /opt/myapp

# 只修改目录权限,不改文件(用 find 配合)
find /opt/myapp -type d -exec chmod 755 {} \;

# 只修改文件权限,不改目录
find /opt/myapp -type f -exec chmod 644 {} \;

3. chown 修改属主和属组

# 修改属主
chown user file.txt

# 修改属主和属组
chown user:group file.txt

# 只修改属组(等同 chgrp)
chown :group file.txt

# 递归修改目录下所有文件
chown -R user:group /opt/myapp

# 查看文件的属主属组
ls -l file.txt
stat file.txt

4. 特殊权限

4.1 SUID(Set User ID)

文件执行时以属主身份运行,而不是执行者身份。passwd 命令就用了 SUID,普通用户执行时以 root 身份修改 /etc/shadow

chmod u+s /usr/bin/program
# 数字模式:在三位数字前加 4
chmod 4755 /usr/bin/program

显示为 rws(属主执行位变成 s)。

4.2 SGID(Set Group ID)

目录设置 SGID 后,在该目录下创建的文件自动继承目录的属组,适合团队共享目录。

chmod g+s /data/shared
chmod 2775 /data/shared

4.3 Sticky Bit

目录设置 Sticky Bit 后,只有文件的属主才能删除自己的文件,其他用户无法删除。/tmp 目录就是这样设置的。

chmod +t /data/shared
chmod 1777 /tmp

显示为 rwt(其他用户执行位变成 t)。

5. 查看权限

# 查看文件权限
ls -l file.txt

# 查看目录权限(不列出目录内容)
ls -ld /opt/myapp

# 查看详细信息(包含数字权限)
stat file.txt