Linux下開發-許可權詳解
許可權的一些基本概念可以檢視《鳥哥的私房菜》,本文只講解跟API相關的許可權問題。
基本概念
UID和GID這樣的識別符號會影響檔案的所有權和訪問許可,以及向其它程式傳送訊號的能力。這些屬性統稱為憑證。
核心會給每個程式關聯兩個和程式ID無關的使用者ID,一個是真實使用者ID,還有一個是有效使用者ID(setuid、setuserID)。真實使用者ID用於標識由誰為正在執行的程式負責,還用於通過kill系統呼叫向其它程式傳送訊號時的許可檢查。有效使用者ID用於為新建立的檔案分配所有權、檢查檔案訪問許可。
有效UID和有效GID影響檔案的建立和訪問。在建立檔案的時候,核心將檔案的所有者屬性設定成建立程式的有效UID和有效GID。在訪問檔案的時候,核心使用程式的有效UID和GID來判斷它是否能夠訪問該檔案。真實UID和真實GID標識程式的真實所有者,會影響到傳送訊號的許可權。對於一個沒有超級使用者許可權的程式來說,僅當它的真實或有效UID等於另一個程式的真實UID匹配時它才能向那個程式傳送訊號。
當一個使用者登入的時候,login程式會把兩對ID設定成密碼資料庫(/etc/passwd檔案,或某些如SunMicrosystems的NIS之類的分散式機制)中指定的UID和GID。當一個程式fork的時候,子程式將從父程式那兒繼承它的憑證。
有三個系統呼叫可以改變憑證。如果一個程式呼叫exec執行一個suid模式的程式,核心將把程式的有效UID修改成檔案的所有者。同樣,如果該程式安裝為sgid模式,核心則會去修改呼叫程式的有效GID。
一個使用者還可以通過呼叫setuid或setgid來改變它的憑證。超級使用者可以通過這些系統呼叫改變真實的和有效的UID以及GID。普通使用者則只能通過這些呼叫來把它們的有效UID或GID改回到真實的數值
chmod和fchmod
<sys/types.h>
<sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fildes, mode_t mode);
為了改變一個檔案的許可權位,程式有效使用者ID,必須等於檔案的所有者ID,或者該程式必須具有超級使用者許可權。
chmod要求給出的是檔案或目錄所在的位置,而fchmod主要針對的是檔案的檔案描述符。(chmod函式在制定的檔案進行操作,而fchmod函式則對已經開啟的檔案進行操作)
Chmod函式的mode常量 |
|
mode |
說明 |
S_ISUID S_ISGID S_ISVIX |
執行時設定使用者ID 執行時設定組ID 儲存正文(粘住位) |
S_IRWXU S_IRUSR S_IWUSR S_IXUSR |
使用者(所有者)讀、寫和執行 使用者(所有者)讀 使用者(所有者)寫 使用者(所有者)執行 |
S_IRWXG S_IRGRP S_IWGRP S_IXGRP |
組讀、寫和執行 組讀 組寫 組執行 |
S_IRWXO S_IROTH S_IWOTH S_IXOTH |
其他讀、寫和執行 其他讀 其他寫 其他執行 |
S_ISVTX位(粘住位)
檔案粘住位:如果一個可執行程式檔案的這一位被設定了,那麼在該程式第一次被執行並結束時,其程式正文部分的一個副本仍被儲存在交換區中,這使得下次執行該程式時能較快地將其裝入記憶體區。交換區佔用連續磁碟空間,可將它視為連續檔案,而且一個程式的正文部分在交換區中也是連續存放的。現今較新的UNIX系統大多都配置有虛擬儲存系統以及快速檔案系統,所以不再需要使用這種技術。
目錄粘住口:如果對一個目錄設定了粘住位,則只有對該目錄具有寫許可權的使用者在滿足下列條件之一的情況下,才能刪除或更名該目錄下的檔案:1.擁有該檔案 2. 擁有該目錄 3. 是超級使用者。
示例:目錄/tmp和/var/spool/uucppublic是設定粘住位的典型候選者——任何使用者都可在這兩個目錄中建立檔案。任一使用者(使用者、組和其他)對這兩個目錄的許可權通常都是讀、寫和執行。但使用者不應刪除或更名屬於其他人的檔案。
umask
#include <sys/stat.h>
mode_t umask(mode_t cmask);
umask的主要作用是在建立檔案時設定或者屏蔽掉檔案的一些許可權。在建立一個檔案時要指明該檔案的許可權,open函式的最後一個引數mode並不是要設定的許可權,它需要執行以下操作mode & (~cmask)。
相關文章
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- Linux常用檔案許可權命令詳解Linux
- MySQL 許可權詳解MySql
- Linux 下許可權的管理Linux
- Linux許可權Linux
- 許可權框架之Shiro詳解框架
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Linux 特殊許可權Linux
- 【詳解】GrantedAuthority(已授予的許可權)
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- 更深入地瞭解 Linux 許可權Linux
- Linux的檔案存取許可權和0644許可權Linux
- linux sudo許可權配置Linux
- Linux 檔案許可權Linux
- Linux的許可權控制Linux
- Linux檔案許可權Linux
- Linux提權-許可權升級Linux
- EDP .Net開發框架--許可權框架
- 詳解 Linux 文件屬性、擁有者、群組、許可權、差異Linux
- [svc]linux檔案許可權Linux
- 全面介紹 Linux 許可權Linux
- Linux 中的許可權管理Linux
- 深入理解Linux許可權Linux
- Linux 許可權入門指南Linux
- linux使用者許可權Linux
- Linux 目錄許可權研究Linux
- 小知識:軟體開發的許可權控制和許可權驗證
- 『學了就忘』Linux許可權管理 — 55、檔案特殊許可權Linux
- XtraBackup工具詳解 Part 4 XtraBackup許可權及配置
- vscode在Linux環境下執行“許可權不夠”的解決方法VSCodeLinux
- 許可權之選單許可權
- linux許可權簡單介紹Linux
- Linux基礎之許可權管理Linux
- Linux使用者與許可權Linux
- Linux檔案許可權管理命令Linux
- Linux中檔案的許可權Linux
- Linux的檔案許可權管理Linux
- Linux中的許可權機制Linux
- Linux賬戶與許可權管理Linux