# 文件系統,第 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 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話