chmod - 管理文件权限

chmod 修改文件或目录的模式位。只有文件所有者或具有相应权限的进程可以修改。

基本权限

权限分为所有者 u、所属组 g、其他用户 oa 表示全部三类:

权限数值文件含义目录含义
r4读取内容列出目录项
w2修改内容创建、删除或重命名目录项
x1执行文件进入和遍历目录
# 为所有者增加执行权限
chmod u+x script.sh
 
# 移除组和其他用户的全部权限
chmod go-rwx private.key
 
# 所有者读写、所属组只读、其他用户无权限
chmod 640 config.ini
 
# 查看八进制权限
stat -c '%a %n' config.ini

特殊权限

特殊权限位位于八进制模式的第一位:

数值名称主要作用
4Set-user-ID(SUID)执行文件时使用文件所有者的有效用户 ID
2Set-group-ID(SGID)执行文件时使用文件所属组;用于目录时让新项目继承目录组
1Sticky Bit用于目录时限制其中项目的删除和重命名

SUID

SUID 主要用于可执行文件。它可能使普通用户以文件所有者的权限执行程序,配置不当会造成提权风险。不要随意给自编脚本或来源不明的程序设置 SUID;许多系统也会忽略脚本上的 SUID。

可以用以下命令检查系统中已有的典型示例:

ls -l /usr/bin/passwd

SGID

SGID 对可执行文件和目录都有意义。共享目录常使用 SGID 让新建项目继承目录的所属组:

chmod g+s shared-directory

是否还能继承默认权限取决于 umask 和 ACL,SGID 本身不会自动授予组写权限。

Sticky Bit

Sticky Bit 常用于多人可写目录。启用后,目录中的项目通常只能由项目所有者、目录所有者或特权进程删除或重命名:

chmod +t shared-drop-directory

它不阻止其他用户修改一个本来就允许其写入的文件内容。

递归修改的风险

chmod -R 会影响整棵目录树。执行前应确认目标绝对路径和预期范围,避免对系统目录、仓库根目录或包含不同权限需求的混合内容直接批量设置同一模式。

# 先检查,再对明确目录执行
find project -maxdepth 2 -printf '%m %p\n'
chmod -R u+rwX,go-rwx project

大写 X 只为目录以及原本已有执行位的文件增加执行权限,通常比递归使用小写 x 更适合目录树。

参考资料