Linux 使用 chmod 与 chown 设置文件和目录权限的实操指南

AI智能摘要
部署或维护 Linux 文件时,权限报错不等于直接 chmod 777:应先用 ls -l 或 stat 查看权限、所有者和所属组,再按文件与目录用途用 chmod 调整权限位、用 chown 修正归属。文章通过 640、750、770 等实例说明数字与符号写法,并提醒递归操作需谨慎,如何在安全与可用之间做出正确授权?
— 此摘要由AI分析文章内容生成,仅供参考。

在部署程序或维护服务器文件时,权限问题通常表现为“程序无法读取配置文件”“目录可以看到却无法进入”或“修改文件时提示权限不足”。处理这类问题时,不要一上来就使用递归授权或把权限改成完全开放,比较稳妥的顺序是:先查看当前权限,再分别调整权限位和所有者,最后复核结果。

先看懂 Linux 权限信息

可以使用 ls -l 查看文件权限、所有者和所属组:

ls -l app.conf

典型输出可能类似这样:

-rw-r----- 1 alice developers 1280 Mar 10 10:20 app.conf

最前面的权限字符串可以分成四部分:

- rw- r-- ---

第一个字符表示对象类型:

  • - 表示普通文件
  • d 表示目录
  • 其他字符可能表示链接或特殊文件

后面的三组权限分别对应:

  1. 文件所有者
  2. 所属组
  3. 其他用户

每组三个字符的含义是:

  • r:读取
  • w:写入
  • x:执行

对于普通文件,x 通常表示可以作为程序执行。对于目录,x 表示可以进入目录或访问目录中的对象;目录只有 r 而没有 x,并不能正常访问其中的文件。

查看目录本身的权限时,建议加上 -d,避免 ls 直接列出目录内容:

ls -ld /path/to/project

如果需要查看更完整的权限和所有者信息,可以使用:

stat app.conf

stat 会显示权限、数字权限值、所有者、所属组以及文件时间等信息。排查时,ls -l 适合快速查看,stat 更适合确认细节。

使用 chmod 修改权限位

用数字方式设置权限

Linux 权限可以用数字表示:

  • r 的值是 4
  • w 的值是 2
  • x 的值是 1

将同一组权限相加,就得到对应的数字。例如:

  • 7:读取、写入、执行
  • 6:读取、写入
  • 5:读取、执行
  • 4:只读
  • 0:没有权限

因此,下面的命令会把 app.conf 设置为所有者可读写、所属组只读、其他用户无权限:

chmod 640 app.conf

设置后可以立即查看结果:

ls -l app.conf

权限通常会显示为:

-rw-r-----

如果是一个需要由所有者执行的脚本,可以使用:

chmod 750 deploy.sh

这表示所有者拥有读取、写入和执行权限,所属组拥有读取和执行权限,其他用户没有权限。

数字方式适合明确指定最终权限,执行后不容易留下旧权限。不过,它会直接覆盖原有权限,使用前应确认不需要保留其他权限位。

用符号方式增加或移除权限

符号方式适合只调整某一类权限,而不影响其他已有设置。

例如,只给文件所有者增加执行权限:

chmod u+x deploy.sh

其中:

  • u 表示所有者
  • g 表示所属组
  • o 表示其他用户
  • a 表示所有用户

给所属组增加读取权限:

chmod g+r app.conf

移除其他用户的写入权限:

chmod o-w app.conf

同时设置所有者可读写、所属组可读、其他用户无权限,也可以写成:

chmod u=rw,g=r,o= app.conf

符号方式的好处是修改范围清晰。例如,下面的命令只增加执行权限,不会改变文件原有的读取和写入权限:

chmod u+x deploy.sh

文件和目录的权限设置不同

普通文件的常见调整

配置文件通常不需要执行权限。如果文件只应该由所有者修改,所属组读取,可以设置为:

chmod 640 app.conf

如果文件中包含不希望其他用户读取的内容,可以进一步限制为只有所有者能够访问:

chmod 600 private.conf

脚本文件需要执行时,应根据实际使用者设置权限,而不是直接使用完全开放的权限。例如:

chmod 750 deploy.sh

不建议为了“先让程序跑起来”而使用下面这种权限:

chmod 777 app.conf

它会让所有用户都拥有读取、写入和执行权限。对于普通配置文件来说,这不仅没有必要,还可能允许其他用户篡改程序配置。即使文件确实需要被多个用户访问,也应先判断是需要读取、写入还是执行,再授予对应权限。

目录的常见调整

目录权限中的 x 很重要。一个用户要进入目录或访问目录中的文件,通常需要对路径上的目录拥有执行权限。

例如,设置项目目录为所有者完全控制、所属组可以读取和进入、其他用户无权访问:

chmod 750 project

如果目录需要让所属组共同维护,可以使用:

chmod 770 project

这表示所有者和所属组可以读取、写入并进入目录,其他用户没有权限。

目录不能简单套用文件权限。比如:

chmod 640 project

这会移除目录的执行权限,用户即使看起来拥有读取权限,也可能无法正常进入目录或访问其中的文件。处理目录时,应根据“谁需要进入”“谁需要创建或删除文件”“谁只需要查看内容”来选择权限。

使用 chown 修改所有者和所属组

chmod 修改的是权限位,chown 修改的是文件或目录的所有者和所属组。查看当前所有者和所属组:

ls -l app.conf

输出中权限后面的两个字段通常就是所有者和所属组。例如:

-rw-r----- 1 alice developers 1280 Mar 10 10:20 app.conf

这里的所有者是 alice,所属组是 developers。

修改文件所有者:

sudo chown alice app.conf

同时修改所有者和所属组:

sudo chown alice:developers app.conf

只修改所属组:

sudo chown :developers app.conf

执行 chown 通常需要管理员权限。当前用户不是目标文件的所有者,或者目标文件属于其他用户时,往往需要使用 sudo。如果系统中不存在指定的用户或组,命令会失败,因此应先确认名称确实存在。

可以用以下命令查看当前登录用户和所属组:

id

也可以分别查看当前用户名和主组:

id -un
id -gn

为了在当前目录创建一个安全的练习环境,可以运行:

mkdir -p permission-demo
touch permission-demo/app.conf
chmod 640 permission-demo/app.conf
chown "$(id -un):$(id -gn)" permission-demo/app.conf
ls -l permission-demo/app.conf

这组命令会创建练习目录和文件,并将文件所有者、所属组设置为当前用户及其主组,不会依赖特定的系统账户名称。

递归修改目录时要特别谨慎

chmod 和 chown 都支持递归操作。例如:

chmod -R 750 project
sudo chown -R alice:developers project

-R 会处理目录以及目录下的所有内容。它适合整个项目确实应该归同一用户和组管理的情况,但不适合不加判断地用于系统目录、共享目录或包含多种文件类型的目录。

递归设置同一个权限,可能导致以下问题:

  • 普通文件被错误地加上执行权限
  • 脚本、配置文件和子目录失去原本不同的权限
  • 其他用户无法访问程序实际需要读取的文件
  • 系统目录中的关键文件被错误修改
  • 文件所有者被整体替换,影响服务运行

例如,目录通常需要执行权限,而普通文件未必需要。因此,对一个混合项目目录直接执行统一的 chmod -R 750,不一定符合所有文件的实际用途。

如果确实需要批量调整,应先查看范围:

find project -maxdepth 2 -ls

确认目录内容后,再考虑分别处理目录和普通文件。可以先为目录设置进入权限:

find project -type d -exec chmod 750 {} ;

再为普通文件设置适合的权限:

find project -type f -exec chmod 640 {} ;

这类命令会影响指定目录下的所有匹配对象,执行前必须确认路径无误。尤其不要在不清楚目标的情况下,对 /、/etc、/usr 等系统路径执行递归修改。

一个完整的检查、修改和复核流程

假设需要调整当前目录中的 app.conf,可以按照下面的顺序操作。

首先查看权限和所有者:

ls -l app.conf

如果需要确认更详细的信息:

stat app.conf

然后根据用途修改权限。例如,让所有者可读写、所属组只读、其他用户无权访问:

chmod 640 app.conf

如果文件还需要交给某个用户和组管理:

sudo chown alice:developers app.conf

最后再次复核:

ls -l app.conf

也可以用数字权限值确认:

stat -c '%A %a %U %G %n' app.conf

这条命令会依次显示字符形式的权限、数字权限、所有者、所属组和文件名。复核时重点检查四项:路径是否正确、权限数字是否符合预期、所有者是否正确、所属组是否正确。

如果修改后程序仍然无法读取文件,不要立即继续放宽权限。应沿着文件所在路径逐级检查目录权限:

ls -ld .
ls -ld /path
ls -ld /path/to
ls -l /path/to/app.conf

文件本身有读取权限,并不代表程序一定能够到达它;路径上的某一级目录缺少执行权限,同样会导致访问失败。

常见错误与处理思路

把 chmod 和 chown 当成同一件事

chmod 只改变权限位,不会改变文件属于谁;chown 改变所有者或所属组,也不会自动替你设置合适的读写执行权限。部署程序时,通常需要先确认所有者和所属组,再单独设置权限。

直接使用 777

777 往往只是暂时绕过权限错误,却无法说明程序真正需要什么权限。更合理的做法是先确认程序需要读取、写入还是执行,再只授予必要权限。对于配置文件、密钥文件和程序目录,尤其不应默认对所有用户开放。

忽略目录的执行权限

目录的 x 不是“运行目录”的意思,而是允许进入目录和访问其中对象。目录缺少执行权限时,即使目录看起来有读取权限,也可能无法列出或打开其中的文件。

在错误路径上执行命令

chown -R 和 chmod -R 一旦路径写错,影响范围可能远超预期。执行递归命令前,可以先用 pwd 确认当前位置,再用 ls 或 find 检查目标内容:

pwd
ls -ld project
find project -maxdepth 1 -ls

确认目标后再执行修改,修改完成后再次检查结果。

掌握权限调整的关键,不是记住一个“万能权限值”,而是把文件用途、访问者和所需操作对应起来:先看清当前状态,再使用 chmod 设置必要的权限,用 chown 确认正确的所有者与所属组,最后通过 ls -l 或 stat 验证修改确实生效。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享