Linux 文件与目录权限管理 (chmod, chown) 详解


哈喽,大家好!今天咱们来聊一个Linux里特别重要,但又经常让新手头疼的话题——文件和目录的权限管理。

在Linux这个多用户操作系统里,权限是保证系统安全的核心机制。 想象一下,如果没有权限控制,你的重要文件岂不是谁都能删改?服务器上的网站配置文件要是能被随便动,那后果不堪设想。

别担心,搞懂它其实没那么难。我们今天的主角是两个命令:chmodchown。学完这篇,你就能像老师傅一样,轻松玩转Linux的文件权限了!

1. 权限到底是个啥?先看懂 ls -l

在操作之前,我们得先能看懂文件的“身份证”。用 ls -l 命令就能列出当前目录下文件的详细信息,你会看到类似下面的一长串东西:

$ ls -l
total 4
-rw-r--r-- 1 myuser mygroup 1024 Sep 12 10:30 my_file.txt
drwxr-xr-x 2 myuser mygroup 4096 Sep 12 10:31 my_directory

我们来拆解一下最开头那串像乱码一样的字符,比如 -rw-r--r--

  • 第1位:文件类型

    • -:代表这是一个普通文件。
    • d:代表这是一个目录(directory)。
    • l:代表这是一个链接(link)文件。
  • 第2-10位:权限位
    这9个字符,三个为一组,分别对应三种不同身份的权限。

    • 第2-4位:文件所有者(User)的权限
    • 第5-7位:所属组(Group)的权限
    • 第8-10位:其他人(Others)的权限

每一组里的 r, w, x 分别代表:

  • r (Read):读取权限。
  • w (Write):写入权限。
  • x (Execute):执行权限。

所以,-rw-r--r-- 的意思就是:

  • 它是一个文件
  • 所有者 myuser 有读、写权限 (rw-)。
  • 所属组 mygroup 只有读权限 (r--)。
  • 其他人 也只有读权限 (r--)。

drwxr-xr-x 则表示:

  • 它是一个目录
  • 所有者 myuser 有读、写、执行权限 (rwx)。
  • 所属组 mygroup 有读、执行权限 (r-x)。
  • 其他人 也有读、执行权限 (r-x)。

小提示:对于目录来说,x 权限很重要,它代表“进入该目录”的权限。如果没有 x 权限,就算你有 r 权限也无法 cd 进去查看目录内容。


2. chmod:修改权限的神器

chmod (change mode) 命令就是用来修改文件和目录的读、写、执行权限的。 它有两种使用方法:符号模式和数字模式。

2.1 符号模式(好记,推荐新手用)

符号模式的格式是 [身份][操作][权限]

  • 身份 (who)

    • u:用户 (user),即文件所有者。
    • g:组 (group),即文件所属组。
    • o:其他人 (others)。
    • a:所有人 (all),即 u, g, o 的总和。
  • 操作 (operator)

    • +:增加权限。
    • -:移除权限。
    • =:精确设置权限(会覆盖掉原有的)。
  • 权限 (permission)

    • r:读。
    • w:写。
    • x:执行。

案例解析

假设我们有个文件 script.sh,初始权限是 -rw-r--r--

  1. 给所有者增加执行权限

    chmod u+x script.sh
    # 权限变为 -rwxr--r--
  2. 给所属组和其他人移除写权限(虽然本来就没有,但可以这么操作)

    chmod go-w script.sh
  3. 同时给所属组增加写权限,给其他人增加读权限

    chmod g+w,o+r script.sh
  4. 给所有人增加执行权限

    chmod a+x script.sh
    # 或者简单点
    chmod +x script.sh
  5. 精确设置权限:我希望所有者可读写执行,其他人没有任何权限

    chmod u=rwx,go= script.sh
    # 权限变为 -rwx------

2.2 数字模式(高效,老手最爱)

数字模式看起来更简洁,但需要一点点换算。它是用数字来代表权限的组合。

  • r = 4
  • w = 2
  • x = 1
  • - (无权限) = 0

把每一组身份(所有者、组、其他人)的权限数字加起来,就得到了一个三位数的权限代码。

  • rwx = 4 + 2 + 1 = 7
  • rw- = 4 + 2 + 0 = 6
  • r-x = 4 + 0 + 1 = 5
  • r-- = 4 + 0 + 0 = 4

最常用组合

  • 755 (rwxr-xr-x):常用于目录。自己拥有一切权限,其他人可以进入和读取。
  • 644 (rw-r--r--):常用于文件。自己可以读写,其他人只能读取。
  • 700 (rwx------):常用于私密文件或目录,只有自己能操作。

案例解析

  1. **将 my_file.txt 权限设置为 rw-r--r--**:

    chmod 644 my_file.txt
  2. **将 my_directory 目录权限设置为 rwxr-xr-x**:

    chmod 755 my_directory
  3. script.sh 脚本设置为所有者可读写执行,其他人无任何权限

    chmod 700 script.sh

2.3 递归修改 -R

如果你想修改一个目录以及它里面所有文件和子目录的权限,加上 -R (Recursive) 参数就行了。

# 危险操作,请谨慎!这会让目录下所有东西都变成777(完全公开)
# chmod -R 777 /some/directory

# 正确示例:给 project 目录及内部所有文件和子目录设置合理的权限
chmod -R 755 /path/to/project

3. chown:修改文件归属

chown (change owner) 命令就更直接了,它是用来改变文件或目录的所有者和所属组的。 通常,这个命令需要 root 超级用户权限才能执行。

基本语法

chown [新的所有者]:[新的所属组] 文件或目录名

案例解析

假设我们有一个叫 app_config.yml 的文件,当前所有者是 root

  1. 只改变所有者
    把文件的所有者改成用户 dev_user

    sudo chown dev_user app_config.yml
  2. 同时改变所有者和所属组
    把文件的所有者改成 dev_user,所属组改成 developers

    sudo chown dev_user:developers app_config.yml
  3. 只改变所属组
    把文件的所属组改成 developers。(注意所有者后面有个冒号)

    sudo chown :developers app_config.yml

    也可以用 chgrp developers app_config.yml 命令,效果一样。

  4. 递归修改 -R
    chmod一样,chown也支持 -R 参数,可以一次性修改目录及其内部所有内容的归属。

    # 将 /var/www/my_app 整个目录的所有者和组都改成 www-data
    sudo chown -R www-data:www-data /var/www/my_app

4. 实战案例:配置Web服务器目录权限

让我们把 chmodchown 结合起来,解决一个真实场景的问题。

场景:你是一个开发者,用户名是 my_dev。你需要在 /var/www/ 目录下创建一个项目 my_project。Web服务器(比如 Nginx 或 Apache)运行的用户是 www-data

要求

  1. my_dev 用户对 /var/www/my_project 目录有完全的控制权,可以任意读、写、创建文件。
  2. www-data 用户需要能读取和执行项目文件,以便能正常运行网站,但不能修改文件。
  3. 其他任何用户都不能访问这个目录。

操作步骤

  1. 创建项目目录并进入

    sudo mkdir -p /var/www/my_project
    cd /var/www/my_project
  2. 改变目录所有权
    将整个目录的所有者设为 my_dev,所属组设为 www-data。这样,你自己作为所有者,Web服务器作为组,就分开了。

    sudo chown -R my_dev:www-data /var/www/my_project
  3. 设置目录权限
    我们需要让所有者(my_dev)有读写执行权限(rwx -> 7),让所属组(www-data)有读和执行权限(r-x -> 5),其他人没有任何权限(--- -> 0)。所以权限代码是 750

    sudo chmod -R 750 /var/www/my_project
    • 对于目录,750 权限是合适的。

    • 但对于文件,通常不需要执行权限。我们可以对文件单独设置 640 (rw-r----) 权限。

      一个更精细的做法是:

      # 先给所有目录设置 750
      sudo find /var/www/my_project -type d -exec chmod 750 {} \;
      
      # 再给所有文件设置 640
      sudo find /var/www/my_project -type f -exec chmod 640 {} \;

现在,my_dev 可以在目录里自由操作,www-data 可以正常提供网页服务,而系统里的其他用户则无法窥探你的项目内容,非常安全!

总结

  • chmod“谁能做什么”(读、写、执行)。
  • chown“这东西是谁的”(所有者、所属组)。

这两个命令是Linux系统管理员和开发者的基本功。一开始可能会觉得数字和符号有点绕,但多用几次,尤其是在真实场景中思考为什么需要设置某个权限,你就会发现它们的设计是如此简洁而强大。

希望这篇口语化的教程能帮你彻底搞懂Linux的权限管理,下次再遇到 “Permission denied”,你就知道该怎么办啦!


  目录