chown 是什么
chown 修改文件与目录的属主与属组。权限模型上它是比 chmod 更根本的一层:属主拥有对这个文件的处置权(包括修改权限位),属组决定同组用户能拿到哪些组权限。普通用户不能把文件送给别人,只有 root 能任意 chown,这条限制是权限体系的基础。另外 chown 会清掉文件上的 setuid 与 setgid 位,这是防止「换个属主就继承特权」的安全设计。
基本信息
| 适用平台 | Linux、macOS、BSD(coreutils / BSD chown) |
|---|---|
| 命令语法 | chown [选项] 用户[:组] 文件... |
| 常用写法 | 用户:组 同时改、用户: 只改属主、:组 只改属组、用户 只改属主、UID:GID 用数字指定(迁移场景) |
| 常用选项 | -R 递归、-h 只改符号链接本身而不改目标、--reference=参考文件 复制其属主属组、-v 输出所有处理、-c 仅变化时输出、--preserve-root 拒绝对 / 递归 |
| 权限要求 | 修改属主需要 root(或 CAP_CHOWN);只改属组时属主可以把文件改到自己所在的组 |
典型使用场景
- 部署纠偏:把应用目录交还给服务账号,修复因手工上传导致的属主错乱
- 共享目录协作:把属组改为团队组,配合 SGID 与组权限实现协作写
- 迁移后修复:跨主机恢复的数据属主是数字 UID,需要按新环境的账号重新映射
- 网站目录:Web 运行账号需要写权限时,把上传目录的属组交给它而不是放宽其他人权限
- 私有文件保护:把敏感文件的属主设为专用账号,配合 600 权限收紧
- 批量校正:用 --reference 把基准文件的属主属组套用到一批文件
常用示例
常用示例
chown -R deploy:developers /opt/app
chown :www-data /srv/www # 只改属组
chown -h root:root /etc/ssl/app.pem # 只改链接本身,不动目标
chown --reference=/etc/hosts /tmp/hosts.tpl
chown 1500:1500 /data/home/deploy # 迁移场景用数字 UID:GID
chown -c -R appuser:appgroup /var/log/myapp
stat -c '%U:%G %a %n' /opt/app /opt/app/bin/start
find /srv/app -user 1001 -maxdepth 2 | head # 找出仍属旧 UID 的文件写法对照
| 写法 | 效果 | 注意 |
|---|---|---|
| user:group | 同时改属主与属组 | 冒号是规范写法,脚本里统一使用 |
| user: | 只改属主,属组保持不变 | 等价于只写 user,但更明确 |
| :group | 只改属组 | 属主可以把文件改到自己所属的组 |
| UID:GID | 按数字指定 | 账号不存在于本机时使用 |
| -h | 只作用于符号链接自身 | 递归时不跟随链接 |
| --reference | 复制参考文件的属主属组 | 批量对齐时比逐条指定更少出错 |
递归与符号链接的关系要分清:chown -R 默认不跟随符号链接(等价 -P),只改链接自身;-H 会跟随命令行上给出的链接,-L 跟随所有链接。误用 -L 可能把某批文件的属主改到链接指向的目录里,范围远超预期。
chown 会清除文件的 setuid 与 setgid 位,且会更新 ctime。前者意味着给 sudo、passwd 这类程序重新 chown 之后必须重新设置特殊位,否则功能异常;后者意味着基于 ctime 的增量备份工具会把这些文件当成新变更重新备份。
递归 chown 前先确认目标路径与挂载边界:/srv 下如果有挂载进来的其他文件系统,chown -R 会一路改过去,影响范围可能超出预期。执行前用 findmnt -T 路径 确认挂载情况,并考虑用 -x 语义的 find 配合 chown 逐个处理。
大批量操作前先空跑:用 find 路径 -user 旧属主 -maxdepth 3 列出将要命中的文件清单,确认数量级与范围符合预期,再决定是否递归执行。