需修改文件权限时,chmod、chown、umask 和 ACL 四条命令覆盖从基础到细粒度的全场景。
权限速查:先看清再动手
Linux 每个文件都有三组权限位(owner、group、other)和三个特殊位(setuid、setgid、sticky)。查看权限最直接的是 stat [1]:
stat -c "%a %U:%G %n" filename
ls -l filename
stat -c "%a" 输出八进制数字模式,如 644;ls -l 输出 -rw-r--r--,第一位 - 表示普通文件,d 表示目录。
chmod:数字与符号模式
chmod 修改文件的 mode bits [2]。数字模式用三位八进制直接覆盖,符号模式增量修改。
chmod 755 script.sh
chmod u+x deploy.sh
chmod go-rwx secret.conf
数字模式直接覆盖,符号模式只改指定部分。递归修改目录用 -R,但先确认路径正确。
特殊权限位附加在数字最前:setuid(4)、setgid(2)、粘滞位(1)。
chmod 4755 /usr/bin/passwd # setuid
chmod 2775 sharedir # setgid
chmod 1777 /tmp # sticky
setuid 让普通用户以文件 owner 身份执行,常用于密码程序;但允许普通用户修改带 setuid 的文件会带来安全风险,实际用时应严格限制路径。
误改时先记下原权限,或用 chmod 恢复默认。
chown:属主与属组修改
chown 修改文件的 owner 和 group [3]。格式 user:group,省略冒号则不改 group。
chown alice:developers project.conf
chown -R www-data:www-data /var/www
只有 root 能任意修改属主;普通用户只能改属于自己的文件。
umask:控制新建文件默认权限
umask 屏蔽位决定新文件/目录的默认权限 [4]。计算方式:默认值 & ~umask(文件默认 666,目录默认 777)。
umask 022 # 文件 644,目录 755
umask 077 # 文件 600,目录 700
umask 只影响当前 shell 及其子进程。持久化写在 ~/.profile 或 /etc/profile.d/ 里。
ACL:细粒度授权
三组权限不够用时,POSIX ACL 可为单个用户或组单独授权 [6] [5]。
setfacl -m u:bin:rwx deploy.log
setfacl -m g:ops:rx /var/www
getfacl deploy.log
- 删除所有扩展 ACL:
setfacl -b file - 备份 ACL:
getfacl file > backup.acl,恢复:setfacl --set=backup.acl file
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
| chmod: 无权修改 | 当前用户不是 owner 且非 root | 用 sudo 或切换 owner |
| chown: 无效用户 | 用户名不存在 | 先 useradd 再修改 |
| ACL 不生效 | 文件系统未挂载 ACL | 检查 mount 选项中 acl |
| umask 不生效 | 修改的是当前 shell,非全局 | 写入 profile 持久化 |
| setuid 被忽略 | 内核或发行版安全策略限制 | 查看 /proc/sys/fs/suid_dumpable |
局限性
- WSL2 和容器中某些权限行为与物理机有差异,如 setuid 在某些文件系统上被忽略
- ACL 需要文件系统支持,部分网络文件系统(如 NFS v3)默认不启用
- 本文实测环境:WSL2 Ubuntu 24.04.4 LTS,内核 6.6.114.1-microsoft-standard-WSL2,测试日期 2026-11-02
附录
chmod 755/644/u+x/go-rwx均符合预期chown root:root和chown -R bin:bin递归生效umask 022→ 文件 644、目录 755;umask 077→ 文件 600、目录 700setfacl -m u:bin:rw后su -s /bin/bash bin -c "echo test > file1"成功写入chmod 4755/2755/1777数字模式正确设置特殊位
参考资料
- [1] stat(1) – display file or file system status(stat-man)
- [2] chmod(1) – change file mode bits(chmod-man)
- [3] chown(1) – change file owner and group(chown-man)
- [4] umask(2) – set file mode creation mask(umask-man)
- [5] setfacl(1) – set file access control lists(setfacl-man)
- [6] acl(5) – Access Control Lists(acl-man)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。