Linux 文件权限详解:chmod、chown 与常见权限问题
前言
在 Linux 服务器上部署程序时,经常会遇到 Permission denied、脚本无法执行或者应用无法读取配置文件等问题。
这些情况很多都和文件权限有关。Linux 的基础权限模型并不复杂,搞清楚文件所有者、用户组和读写执行权限之后,大部分常见问题都能自己排查。
一、查看文件权限
先使用 ls 查看文件信息:
ls -l /opt/app/start.sh
假设输出如下:
-rwxr-x--- 1 root app 1024 Oct 23 10:00 start.sh
最前面的 -rwxr-x--- 就是文件类型和权限。
第一个字符 - 表示普通文件,d 则表示目录。后面每三个字符为一组:
- rwx:文件所有者可读、可写、可执行。
- r-x:所属用户组可读、可执行。
- —:其他用户没有访问权限。
这里文件所有者是 root,所属组是 app。
二、chmod 数字权限怎么理解?
Linux 权限通常用三个数字表示,分别对应所有者、所属组和其他用户。
每种权限有一个数值:
- r(读取)= 4
- w(写入)= 2
- x(执行)= 1
例如:
chmod 755 start.sh
755 对应 rwxr-xr-x,也就是所有者拥有全部权限,其他用户只能读取和执行。
再比如:
chmod 600 config.env
600 对应 rw-------,只有文件所有者可以读取和修改。
几个常见权限组合:
| 权限 | 含义 | 常见用途 |
|---|---|---|
| 644 | 所有者可读写,其他用户只读 | 普通文本文件 |
| 600 | 仅所有者可读写 | 私有配置文件 |
| 755 | 所有者可读写执行,其他用户可读执行 | 公共程序或目录 |
| 700 | 仅所有者拥有全部权限 | 私有目录或脚本 |
这些只是常见示例,实际权限还要根据应用的运行用户和访问需求确定。
三、目录权限和文件权限不完全一样
这是比较容易忽略的一点。
对于普通文件,r 表示读取内容,w 表示修改内容,x 表示允许作为程序执行(能否实际执行还取决于文件格式等条件)。
对于目录:
- r:允许读取目录中的文件名列表。
- w:允许修改目录项,例如创建或删除文件,通常还需要 x 权限。
- x:允许搜索或进入目录,并访问已知名称的文件。
所以一个文件即使设置了 644,如果用户没有其上级目录的搜索权限,仍然可能无法访问。
另外,删除文件主要取决于所在目录的权限,并不是只看该文件有没有写权限。
四、修改文件所有者
如果文件权限看起来正常,但应用依然无法访问,可以检查文件属于哪个用户。
例如:
ls -l /opt/app/config.yaml
假设应用以 www-data 用户运行,而配置文件属于 root,且只有 root 可以读取,那么程序就可能报权限错误。
可以根据实际需求修改所有者:
sudo chown www-data:www-data /opt/app/config.yaml
这个命令同时修改文件所有者和所属组。
如果只需要让应用读取文件,也可以考虑通过合理的用户组权限解决,不一定非要把所有文件都改为应用用户所有。
五、不要直接使用 chmod -R 777
遇到权限报错时,有些人会直接执行:
chmod -R 777 /opt/app
这种方式虽然可能暂时解决问题,但会让所有用户对相关文件和目录拥有读、写、执行权限,存在不必要的安全风险。
而且它并没有解决真正的问题,比如程序运行用户不正确、目录归属错误或者挂载配置不合理。
更稳妥的方式是先确认应用实际以哪个用户运行,再根据需要调整相关文件或目录的权限。
例如,只希望某个脚本增加所有者执行权限,可以使用:
chmod u+x start.sh
相比直接设置 777,这样修改范围更小。
六、权限排查的常用命令
检查文件权限和所有者:
ls -l /opt/app/start.sh
检查路径上各级目录的权限:
namei -l /opt/app/start.sh
查看当前用户和所属用户组:
id
查看文件的详细权限信息:
stat /opt/app/start.sh
如果这些权限都没问题,还需要考虑 ACL、SELinux、AppArmor 或文件系统只读挂载等其他访问限制。
总结
Linux 文件权限排查可以遵循一个简单的顺序:
- 用 ls -l 确认文件权限、所有者和用户组。
- 用 id 检查应用实际运行用户的身份。
- 检查文件上级目录是否具有必要的访问权限。
- 使用 chmod 或 chown 做最小范围的修改。
- 避免直接给整个目录设置 777。
大多数权限问题并不需要复杂操作,关键是找到实际执行程序的用户,以及这个用户究竟缺少哪一项权限。
- 点赞
- 收藏
- 关注作者
评论(0)