# 文件系统，第 3 部分：权限

> 原文：<https://github.com/angrave/SystemProgramming/wiki/File-System%2C-Part-3%3A-Permissions>

## 再次重申一下权限意味着什么？

每个文件和目录都有一组 9 个权限位和一个类型字段

*   r，读取文件的权限
*   w，写入文件的权限
*   x，执行文件的权限

chmod 777

| CHMOD | 7 | 7 | 7 |
| --- | --- | --- | --- |
| 01 | 111 | 111 | 111 |
| d | rwx | rwx | rwx |
| 1 | 2 | 3 | 4 |

1.  文件类型

2.  所有者权限

3.  组权限

4.  其他人的许可

`mknod`更改第一个字段，即文件的类型。 `chmod`接受一个数字和一个文件并更改权限位。

该文件有一个所有者。如果您的进程具有与所有者（或 root）相同的用户 ID，则第一个三元组中的权限将适用于您。如果您与文件位于同一组（所有文件也归组所有），则下一组权限位适用于您。如果以上都不适用，则最后一个三元组适用于您。

## 如何更改文件的权限？

使用`chmod`（“更改文件模式位”的缩写）

也可以使用下面这个系统函数`int chmod(const char *path, mode_t mode);`，但我们将专注于 shell 命令。使用`chmod`有两种常用方法;使用八进制值或符号字符串：

```
$ chmod 644 file1
$ chmod 755 file2
$ chmod 700 file3
$ chmod ugo-w file4
$ chmod o-rx file4 
```

base-8（'octal'）数字描述了每个角色的权限：拥有该文件的用户，该组以及其他所有人。八进制数是给予三种权限类型的三个值的总和：read（4），write（2），execute（1）

示例：chmod 755 myfile

*   r + w + x =数字
*   当前用户有 4 + 2 + 1，完全权限
*   当前组具有 4 + 0 + 1，读取和执行权限
*   其它用户都有 4 + 0 + 1，读取和执行权限

## 如何从 ls 读取权限字符串？

使用`ls -l'。请注意，权限将以“drwxrwxrwx”格式输出。第一个字符表示文件类型的类型。第一个字符的可能的取值：

*   （-）常规文件
*   （d）目录
*   （c）字符设备文件
*   （l）链接
*   （p）管道
*   （b）块设备
*   （s）网络设备

## 什么是 sudo？

使用`sudo`可以获取超级管理员权限。例如通常（除非在'/ etc / fstab'文件中明确指定，否则您需要 root 权限才能挂载文件系统）。 `sudo`可用于以 root 身份临时运行命令（前提是用户具有 sudo 权限）

```
$ sudo mount /dev/sda2 /stuff/mydisk
$ sudo adduser fred 
```

## 如何更改文件的所有权？

使用`chown username filename`

## 如何从代码中设置权限？

`chmod(const char *path, mode_t mode);`

## 为什么有些文件要进行'setuid'操作？这是什么意思？

set-user-ID-on-execution是为了在文件运行时更改与进程关联的用户。这通常用于需要有root权限才行，但由非root用户执行的该命令。这个时候就用到`sudo`

set-group-ID-on-execution 更改运行进程的组。

## 它们为什么有用？

最常见的用例是，用户可以在程序的持续时间内拥有 root（admin）访问权限。

## sudo 运行的权限是什么？

```
$ ls -l /usr/bin/sudo
-r-s--x--x  1 root  wheel  327920 Oct 24 09:04 /usr/bin/sudo 
```

's'位表示执行和 set-uid;该进程的有效用户标识将与父进程不同。在这个例子中它将是 root

## getuid（）和 geteuid（）之间有什么区别？

*   `getuid`返回真实用户 ID（如果以 root 身份登录则为零）
*   `geteuid`返回有效的用户 ID（如果作为 root 用户，则为零，例如由于程序上设置的 setuid 标志）

## 如何确保只有特权用户才能运行我的代码？

*   通过调用`geteuid()`检查用户的有效权限。返回值为零表示程序以 root 身份有效运行。

[转到文件系统：第 4 部分](https://github.com/angrave/SystemProgramming/wiki/File-System,-Part-4:-Working-with-directories)