# 文件系统,第 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,完全权限
* group 具有 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)
- UIUC CS241 系统编程中文讲义
- 0. 简介
- #Informal 词汇表
- #Piazza:何时以及如何寻求帮助
- 编程技巧,第 1 部分
- 系统编程短篇小说和歌曲
- 1.学习 C
- C 编程,第 1 部分:简介
- C 编程,第 2 部分:文本输入和输出
- C 编程,第 3 部分:常见问题
- C 编程,第 4 部分:字符串和结构
- C 编程,第 5 部分:调试
- C 编程,复习题
- 2.进程
- 进程,第 1 部分:简介
- 分叉,第 1 部分:简介
- 分叉,第 2 部分:Fork,Exec,等等
- 进程控制,第 1 部分:使用信号等待宏
- 进程复习题
- 3.内存和分配器
- 内存,第 1 部分:堆内存简介
- 内存,第 2 部分:实现内存分配器
- 内存,第 3 部分:粉碎堆栈示例
- 内存复习题
- 4.介绍 Pthreads
- Pthreads,第 1 部分:简介
- Pthreads,第 2 部分:实践中的用法
- Pthreads,第 3 部分:并行问题(奖金)
- Pthread 复习题
- 5.同步
- 同步,第 1 部分:互斥锁
- 同步,第 2 部分:计算信号量
- 同步,第 3 部分:使用互斥锁和信号量
- 同步,第 4 部分:临界区问题
- 同步,第 5 部分:条件变量
- 同步,第 6 部分:实现障碍
- 同步,第 7 部分:读者编写器问题
- 同步,第 8 部分:环形缓冲区示例
- 同步复习题
- 6.死锁
- 死锁,第 1 部分:资源分配图
- 死锁,第 2 部分:死锁条件
- 死锁,第 3 部分:餐饮哲学家
- 死锁复习题
- 7.进程间通信&amp;调度
- 虚拟内存,第 1 部分:虚拟内存简介
- 管道,第 1 部分:管道介绍
- 管道,第 2 部分:管道编程秘密
- 文件,第 1 部分:使用文件
- 调度,第 1 部分:调度过程
- 调度,第 2 部分:调度过程:算法
- IPC 复习题
- 8.网络
- POSIX,第 1 部分:错误处理
- 网络,第 1 部分:简介
- 网络,第 2 部分:使用 getaddrinfo
- 网络,第 3 部分:构建一个简单的 TCP 客户端
- 网络,第 4 部分:构建一个简单的 TCP 服务器
- 网络,第 5 部分:关闭端口,重用端口和其他技巧
- 网络,第 6 部分:创建 UDP 服务器
- 网络,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:远程过程调用简介
- 网络复习题
- 9.文件系统
- 文件系统,第 1 部分:简介
- 文件系统,第 2 部分:文件是 inode(其他一切只是数据...)
- 文件系统,第 3 部分:权限
- 文件系统,第 4 部分:使用目录
- 文件系统,第 5 部分:虚拟文件系统
- 文件系统,第 6 部分:内存映射文件和共享内存
- 文件系统,第 7 部分:可扩展且可靠的文件系统
- 文件系统,第 8 部分:从 Android 设备中删除预装的恶意软件
- 文件系统,第 9 部分:磁盘块示例
- 文件系统复习题
- 10.信号
- 过程控制,第 1 部分:使用信号等待宏
- 信号,第 2 部分:待处理的信号和信号掩码
- 信号,第 3 部分:提高信号
- 信号,第 4 部分:信号
- 信号复习题
- 考试练习题
- 考试主题
- C 编程:复习题
- 多线程编程:复习题
- 同步概念:复习题
- 记忆:复习题
- 管道:复习题
- 文件系统:复习题
- 网络:复习题
- 信号:复习题
- 系统编程笑话