255 lines
4.7 KiB
Markdown
255 lines
4.7 KiB
Markdown
## 1、文件权限概览
|
||
|
||
Linux 文件权限控制的核心对象有三类:
|
||
|
||
- `u`:属主(user)
|
||
- `g`:属组(group)
|
||
- `o`:其他用户(others)
|
||
|
||
对应的基本权限有三种:
|
||
|
||
- `r`:读,值为 4
|
||
- `w`:写,值为 2
|
||
- `x`:执行,值为 1
|
||
|
||
权限控制是 Linux 安全模型的基础之一,和文件访问、脚本执行、目录操作都直接相关。
|
||
|
||
## 2、文件权限与目录权限的区别
|
||
|
||
### 2.1 文件权限
|
||
|
||
对**普通文件**来说:
|
||
|
||
- `r`:可以读取文件内容
|
||
- `w`:可以修改文件内容
|
||
- `x`:可以把该文件作为程序执行
|
||
|
||
### 2.2 目录权限
|
||
|
||
对**目录**来说,权限含义和普通文件不完全一样:
|
||
|
||
- `r`:可以查看目录中的文件名列表
|
||
- `w`:可以在目录中创建、删除、重命名文件
|
||
- `x`:可以进入目录,也可以访问目录项的元数据
|
||
|
||
目录权限是很多初学者最容易搞混的地方。
|
||
|
||
## 3、`ls -l` 权限格式
|
||
|
||
```shell
|
||
root@lzc:/var/log# ls -l
|
||
-rw-r--r-- 1 root root 0 Dec 5 00:00 alternatives.log
|
||
```
|
||
|
||
这一行的主要含义:
|
||
|
||
- `-`:文件类型,表示普通文件
|
||
- `rw-`:属主权限
|
||
- `r--`:属组权限
|
||
- `r--`:其他用户权限
|
||
- `1`:硬链接数
|
||
- `root`:属主
|
||
- `root`:属组
|
||
- `0`:文件大小
|
||
- `Dec 5 00:00`:最近修改时间
|
||
- `alternatives.log`:文件名
|
||
|
||
## 4、修改属主和属组
|
||
|
||
### 4.1 `chown`
|
||
|
||
用于修改文件属主,也可以同时修改属组。
|
||
|
||
```shell
|
||
chown root:root fileName
|
||
```
|
||
|
||
表示把文件的属主和属组都改为 `root`。
|
||
|
||
常见选项:
|
||
|
||
- `-R`:递归处理目录及其内部文件
|
||
|
||
### 4.2 `chgrp`
|
||
|
||
用于单独修改文件属组。
|
||
|
||
常见选项:
|
||
|
||
- `-R`:递归处理
|
||
|
||
示例:
|
||
|
||
```shell
|
||
chgrp devops fileName
|
||
```
|
||
|
||
## 5、修改权限 `chmod`
|
||
|
||
`chmod` 用于修改文件或目录权限。
|
||
|
||
### 5.1 数字方式
|
||
|
||
常见组合:
|
||
|
||
- `7` = `rwx`
|
||
- `6` = `rw-`
|
||
- `5` = `r-x`
|
||
- `4` = `r--`
|
||
|
||
例如:
|
||
|
||
```shell
|
||
chmod 644 file.txt
|
||
chmod 755 script.sh
|
||
```
|
||
|
||
### 5.2 符号方式
|
||
|
||
可以使用 `u`、`g`、`o`、`a` 搭配 `+`、`-`、`=` 设置权限。
|
||
|
||
示例:
|
||
|
||
```shell
|
||
chmod u+x script.sh
|
||
chmod g-w file.txt
|
||
chmod o-r file.txt
|
||
```
|
||
|
||
### 5.3 递归修改
|
||
|
||
```shell
|
||
chmod -R 755 dirName
|
||
```
|
||
|
||
对目录递归改权限时要非常谨慎,避免把文件和目录都改成不合适的权限。
|
||
|
||
## 6、默认权限 `umask`
|
||
|
||
`umask` 决定新建文件和目录时默认去掉哪些权限。
|
||
|
||
### 6.1 常见规则
|
||
|
||
- 文件默认基准通常是 `666`
|
||
- 目录默认基准通常是 `777`
|
||
|
||
因此:
|
||
|
||
- 文件默认权限 ≈ `666 - umask`
|
||
- 目录默认权限 ≈ `777 - umask`
|
||
|
||
### 6.2 常见默认值
|
||
|
||
- `root` 常见默认值:`022`
|
||
- 普通用户常见默认值:`002` 或 `022`
|
||
|
||
### 6.3 永久生效
|
||
|
||
如果想长期修改 `umask`,通常写入:
|
||
|
||
- `/etc/profile`
|
||
- `~/.bashrc`
|
||
- `~/.profile`
|
||
|
||
具体取决于系统和登录方式。
|
||
|
||
## 7、特殊权限
|
||
|
||
除了普通的 `rwx` 外,Linux 还有 3 类常见特殊权限:
|
||
|
||
- SUID
|
||
- SGID
|
||
- Sticky Bit
|
||
|
||
### 7.1 SUID
|
||
|
||
SUID 主要作用在**可执行文件**上。
|
||
|
||
效果:普通用户执行该程序时,会临时以**文件属主**的身份运行。
|
||
|
||
典型例子:
|
||
|
||
```shell
|
||
ls -l /bin/passwd
|
||
```
|
||
|
||
可能看到:
|
||
|
||
```shell
|
||
-rwsr-xr-x
|
||
```
|
||
|
||
其中属主执行位上的 `s` 就表示设置了 SUID。
|
||
|
||
### 7.2 SGID
|
||
|
||
SGID 有两种常见作用:
|
||
|
||
- 作用在可执行文件上:以文件属组身份运行
|
||
- 作用在目录上:新建文件会继承该目录的属组
|
||
|
||
这在团队共享目录里非常常见。
|
||
|
||
### 7.3 Sticky Bit
|
||
|
||
Sticky Bit 主要作用在目录上。
|
||
|
||
效果:目录中的文件通常只能被**文件所有者**或 `root` 删除。
|
||
|
||
典型例子:
|
||
|
||
```shell
|
||
ls -ld /tmp
|
||
```
|
||
|
||
可能看到:
|
||
|
||
```shell
|
||
drwxrwxrwt
|
||
```
|
||
|
||
最后的 `t` 就表示设置了 Sticky Bit。
|
||
|
||
## 8、特殊属性 `chattr` 与 `lsattr`
|
||
|
||
除了权限位外,Linux 还支持一些额外文件属性。
|
||
|
||
### 8.1 `chattr`
|
||
|
||
常见属性:
|
||
|
||
- `+i`:不可删除、不可改名、不可修改
|
||
- `+a`:只能追加内容,不能覆盖或删除
|
||
|
||
示例:
|
||
|
||
```shell
|
||
chattr +i important.conf
|
||
chattr +a app.log
|
||
```
|
||
|
||
### 8.2 `lsattr`
|
||
|
||
用于查看文件特殊属性。
|
||
|
||
```shell
|
||
lsattr important.conf
|
||
```
|
||
|
||
## 9、常见运维建议
|
||
|
||
- 给脚本加执行权限前,先确认内容安全
|
||
- 不要随意对系统目录做递归 `chmod -R 777`
|
||
- 团队共享目录可考虑配合 SGID 使用
|
||
- 核心配置文件可结合 `chattr +i` 防误删或误改
|
||
- 处理目录权限时,一定要先区分“文件权限”和“目录权限”
|
||
|
||
## 10、小结
|
||
|
||
- `rwx` 是 Linux 权限的基础
|
||
- 文件权限和目录权限含义不同
|
||
- `chown`、`chgrp`、`chmod` 是最常见的权限管理命令
|
||
- `umask` 决定新建文件和目录的默认权限
|
||
- SUID、SGID、Sticky Bit 是高频特殊权限知识点
|
||
- `chattr` 和 `lsattr` 用于管理更细粒度的文件属性
|