<commit_before><commit_msg>Linux文件权限和访问模式笔记<commit_after># Linux文件权限和访问模式
为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限

## 文件权限
对应拥有者(user owner)，所属用户组(group owner )和所有其他人(other)

- **所有者权限(`u`)**：文件所有者能够进行的操作
- **组权限(`g`)**：文件所属用户组能够进行的操作
- **外部权限(`o`)（其他权限)**：其他用户可以进行的操作。

## 查看文件权限

使用 `ls -l` 命令可以查看与文件权限相关的信息
- **第一列**就包含了文件或目录的权限
- 第一列的字符可以分为三组，每一组有三个，每个字符都代表不同的权限，分别为读取(`r`)、写入(`w`)和执行(`x`)

## 文件访问模式
文件权限是Linux系统的第一道安全防线，基本的权限有`读取(r)`、`写入(w)`和`执行(x)`：
- **读取**：用户能够读取文件信息，查看文件内容。
- **写入**：用户可以编辑文件，可以向文件写入内容，也可以删除文件内容。
- **执行**：用户可以*将文件作为程序来运行*。

## 目录访问模式
与文件类似，但是稍有不同
- **读取**：用户可以查看目录中的文件
- **写入**：用户可以在当前目录中删除文件或创建文件
- **执行**：执行权限**赋予用户遍历目录的权利**，例如执行 `cd` 和 `ls` 命令。

## 改变权限
 `chmod` **(change mode)** 命令来改变文件或目录的访问权限
- **权限**可以使用`符号`或`数字`来表示

1. 使用符号表示权限
   - 对于初学者来说最简单的就是使用符号来改变文件或目录的权限，你可以增加(`+`)和删除(`-`)权限，也可以指定(`=`)特定权限

| 符号 |	说明 |
| :----- | :------ |
| + |	为文件或目录增加权限 |
| -	| 删除文件或目录的权限 |
| =	 | 设置指定的权限 |

2. 使用数字表示权限
使用数字表示权限

| 数字 |	说明 |	权限 |
|:---- |:---- |:----- |
| 0	|没有任何权限 |	--- | 
| 1	|执行权限	| --x |
| 2	|写入权限	 | -w- |
| 3	|执行权限和写入权限：| 1 (执行) + 2 (写入) = 3	-wx |
| 4	|读取权限	| r-- |
| 5	|读取和执行权限：| 4 (读取) + 1 (执行) = 5	r-x |
| 6	|读取和写入权限：| 4 (读取) + 2 (写入) = 6	rw- |
| 7 |	所有权限: | 4 (读取) + 2 (写入) + 1 (执行) = 7	rwx |

## 更改所有者和用户组
每添加一个新用户，就会为它分配一个`用户ID`和`群组ID`
- 文件权限也是**基于用户**和**群组**来分配的

1. `chown`：**change owner**的缩写，用来改变文件的`所有者`。
2. `chgrp`：**change group**的缩写，用来改变文件所在的`群组`

- `chown` 命令用来更改文件所有者
```
$ chown user filelist  # user 可以是用户名或用户ID
```

- `chgrp` 命令用来改变文件所属群组
```
$ chgrp group filelist # group可以是群组名或群组ID
```

## SUID和SGID位
- 在Linux中，一些程序需要**特殊权限**才能完成用户指定的操作

> 用户的密码保存在 /etc/shadow 文件中，出于安全考虑，一般用户没有读取和写入的权限。但是当我们使用 passwd 命令来更改密码时，需要对 /etc/shadow 文件有写入权限。这就意味着，passwd 程序必须要给我们一些特殊权限，才可以向 /etc/shadow 文件写入内容

Linux 通过给程序设置`SUID`(**Set User ID**)和`SGID`(**Set Group ID**)位来赋予普通用户特殊权限

- 当我们运行一个**带**有`SUID位`的程序时，就会继承该程序所有者的权限；
- 如果程序**不带**`SUID位`，则会根据程序使用者的权限来运行。

- `SGID`也是一样

- 如果程序设置了`SUID位`，就会在表示文件所有者可执行权限的位置上出现`s`字母；同样，
- 如果设置了`SGID`，就会在表示文件群组可执行权限的位置上出现`s`字母 

```
$ ls -l /usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47  /usr/bin/passwd*
```

- 第一列第四个字符不是`x`或`-`，而是`s`，说明 `/usr/bin/passwd` 文件设置了`SUID位`，这时普通用户会以`root`用户的权限来执行`passwd`程序

> **Notes:**  
> 小写字母`s`说明文件所有者有执行权限(`x`)，大写字母`S`说明程序所有者没有执行权限(`x`)

- 在表示群组权限的位置上出现`SGID位`，那么也仅有三类用户可以删除该目录下的文件
   1. 目录所有者
   2. 文件所有者
   3. 超级用户root

- 为一个目录设置`SUID`和`SGID位`可以使用下面的命令   
```
$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root  4096 Jun 19 06:45 dirname
```
{'fraction_non_alphanumeric': 0.21911705143782909, 'fraction_numerical': 0.02025111381125962, 'mean_word_length': 4.575620767494357, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 6, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4041631', 'n_tokens_mistral': 1934, 'n_tokens_neox': 2034, 'n_words': 181}