Linux 【02- chown命令超详细教程】

Linux chown 超详细完整教程

一、命令作用

chown = change owner,修改文件/目录的所有者(用户)所属组(用户组)

Linux 每个文件都有两个权限归属:

  1. 属主(owner):文件属于哪个用户
  2. 属组(group):文件属于哪个用户组

只有 root 超级用户 或文件原所有者能执行 chown。

二、基础语法

bash 复制代码
chown [选项] 属主[:属组] 文件/目录

拆分三种格式:

  1. 只改用户:chown user 文件
  2. 只改组:chown :group 文件(冒号前空)
  3. 用户+组一起改:chown user:group 文件

三、常用参数(高频必记)

参数 作用
-R 递归修改,目录内所有子文件、子目录同步变更(最常用)
-v 显示执行过程,打印每个修改的文件
-c 只显示实际发生变更的文件(比v简洁)
-h 不跟随软链接,只修改链接本身(不加则修改链接指向的原文件)
--reference=file 参考另一个文件的归属,复制它的用户和组

四、前置准备:查看用户、组、文件归属

1. 查看文件当前所有者

bash 复制代码
ls -l test.txt
# 输出示例
-rw-r--r-- 1 root root 123 Jul  1 10:00 test.txt
# 第3列:属主 root
# 第4列:属组 root

2. 查看系统所有用户

bash 复制代码
cat /etc/passwd

3. 查看系统所有用户组

bash 复制代码
cat /etc/group

4. 查看当前登录用户、所属组

bash 复制代码
whoami       # 当前用户名
id           # 查看uid、gid、附属组
id username  # 查看指定用户信息

五、基础实操示例(由浅入深)

1. 修改文件属主(仅改用户)

test.log 所有者改为 www 用户

bash 复制代码
chown www test.log

2. 仅修改文件所属组(冒号开头)

test.log 组改成 nginx

bash 复制代码
chown :nginx test.log

3. 同时修改属主+属组(最常用)

文件归属改为用户 www,组 www

bash 复制代码
chown www:www test.log

4. 递归修改整个目录(-R 重点)

网站目录 /var/www 全部文件递归归属 www:www

bash 复制代码
chown -R www:www /var/www

生产场景:网站、日志、项目目录必用 -R,否则子文件权限不变。

5. 打印修改详情(-v)

bash 复制代码
chown -Rv www:www /var/www

执行后逐条输出:changed ownership of '/var/www/index.html' from root:root to www:www

6. 只打印有变更的文件(-c)

bash 复制代码
chown -Rc www:www /var/www

无变化的文件不会输出,日志更干净。

7. 不跟随软链接(-h)

目录里存在软链接,只修改链接本身,不改动源文件:

bash 复制代码
chown -Rh www:www /data/linkdir

不加 -h 会直接修改软链接指向的真实文件,容易误改系统文件。

8. 复制参考文件的所有者(--reference)

newfile.txttemplate.txt 用户、组完全一致

bash 复制代码
chown --reference=template.txt newfile.txt

无需手动写用户名,批量标准化权限神器。

六、使用UID/GID数字修改(不写用户名)

每个用户/组都有数字ID,也可直接用数字修改:

bash 复制代码
# uid=1000,gid=1000
chown 1000:1000 test.txt

适用场景:容器、跨系统同步、用户名不存在但ID存在时。

七、批量处理多个文件/目录

1. 空格分隔多个目标

bash 复制代码
chown www:www a.txt b.log /data/dir1

2. 通配符批量匹配

目录下所有 .html 文件统一改归属

bash 复制代码
chown www:www *.html
# 递归所有子目录html文件
find /var/www -name "*.html" -exec chown www:www {} \;

八、sudo 普通用户执行 chown

普通用户默认无权修改不属于自己的文件,必须加 sudo 提权:

bash 复制代码
# 普通用户执行,加sudo
sudo chown -R www:www /var/www

root 用户不需要 sudo。

九、常见生产场景案例

场景1:Nginx网站目录权限修复

网站文件被root创建,访问报403,统一归属www用户组

bash 复制代码
sudo chown -R www:www /usr/share/nginx/html

场景2:日志目录归属调整

程序日志目录归属错误无法写入

bash 复制代码
sudo chown -R app:app /var/log/myapp

场景3:FTP上传目录,ftp用户读写

bash 复制代码
sudo chown -R ftp:ftp /home/ftp/upload

场景4:Docker挂载目录权限

容器内用户uid=1000,宿主机目录统一修改ID

bash 复制代码
sudo chown -R 1000:1000 /opt/mount/data

十、常见报错与排错

1. Operation not permitted

原因:普通用户修改他人文件,无权限

解决:命令前加 sudo

2. invalid user / invalid group

原因:用户名/组名不存在

排查:id 用户名cat /etc/group 核对名称

3. 递归修改后软链接源文件权限错乱

原因:没加 -h,chown跟随软链接修改源文件

解决:递归场景统一搭配 -Rh

4. 目录改了,内部文件权限不变

忘记加 -R,只修改目录本身,子文件不生效

解决:目录操作必须带 -R

十一、chown vs chmod 核心区别(极易混淆)

  1. chown:改所有者、所属组(谁拥有文件)
  2. chmod:改读写执行权限 rwx(拥有者能做什么)

搭配使用标准流程:

bash 复制代码
# 1. 归属修改
chown -R www:www /var/www
# 2. 权限修改
chmod -R 755 /var/www

十二、安全注意事项

  1. 不要随意把系统文件递归改为普通用户(如 /etc/bin),会导致系统崩溃;
  2. 网站、业务目录尽量使用独立业务用户(www/app),禁止长期用root运行业务;
  3. 软链接场景优先使用 -h 参数,避免误篡改系统核心文件;
  4. 批量递归 -R 前可加 -v 预览修改内容,防止路径输错。