嵌入式Linux:文件訪問權限
在 Linux 中,文件訪問權限決定了哪些用戶和用戶組可以讀取、寫入或執行文件。這些權限通過文件系統中的元數據來定義,并且可以使用多種工具進行查看和更改。
每個文件和目錄都有三個不同的權限級別:
所有者(Owner):文件或目錄的創建者。
用戶組(Group):與文件或目錄相關聯的用戶組。
其他用戶(Others):系統中的其他所有用戶。
每個級別都有三個權限:
讀取(Read, r):允許讀取文件內容或列出目錄內容。
寫入(Write, w):允許修改文件內容或創建、刪除目錄中的文件。
執行(Execute, x):允許執行文件(對于目錄,允許進入該目錄)。
1
查看文件權限
使用 ls -l 命令可以查看文件和目錄的權限。例如:
$ ls -l-rw-r--r-- 1 user group 1234 Jan 1 12:34 example.txt
輸出的第一列包含 10 個字符,代表文件類型和權限:
第一個字符:文件類型(- 表示普通文件,d 表示目錄,l 表示符號鏈接等)。
后面九個字符:每組三個字符,分別表示所有者、組和其他用戶的權限。
在這個示例中,-rw-r--r-- 表示:
所有者:rw-(讀和寫)
用戶組:r--(只讀)
其他用戶:r--(只讀)
2
修改文件權限
使用 chmod 命令可以更改文件或目錄的權限。有兩種方式:符號表示法和八進制表示法。
2.1、符號表示法
符號表示法使用 +、- 和 = 操作符來添加、移除或設置權限。
示例如下:
# 為所有者添加執行權限$ chmod u+x example.txt # 為用戶組添加寫權限$ chmod g+w example.txt # 為其他用戶移除讀權限$ chmod o-r example.txt # 為所有用戶設置讀取權限$ chmod a=r example.txt
2.2、八進制表示法
八進制表示法使用三個八進制數字來表示所有者、組和其他用戶的權限。
每個權限有一個相應的值:
讀取(r):4
寫入(w):2
執行(x):1
示例如下:
# 設置所有者讀寫執行,組讀執行,其他用戶只讀$ chmod 754 example.txt # 設置所有用戶讀寫執行權限$ chmod 777 example.txt
3
access函數
access 函數用于檢查調用進程是否有權限訪問指定的文件或目錄。它可以用來判斷一個文件是否存在,以及檢查讀、寫、執行權限。
函數原型如下:
#include <unistd.h> int access(const char *pathname, int mode);
參數說明:
pathname:要檢查的文件或目錄的路徑。
mode:要檢查的權限,可以是以下常量的組合:
F_OK:檢查文件是否存在。
R_OK:檢查文件是否可讀。
W_OK:檢查文件是否可寫。
X_OK:檢查文件是否可執行。
返回值:
如果調用進程具有指定的訪問權限,則返回 0。
如果調用進程不具有指定的訪問權限,或者出錯,則返回 -1,并設置 errno 以指示錯誤。
以下是一個示例程序,它使用 access 函數檢查文件的各種訪問權限。
#include <stdio.h>#include <unistd.h> void check_access(const char *filepath) { // 檢查文件是否存在 if (access(filepath, F_OK) == 0) { printf("File %s exists.n", filepath); } else { printf("File %s does not exist.n", filepath); return; } // 檢查文件是否可讀 if (access(filepath, R_OK) == 0) { printf("File %s is readable.n", filepath); } else { printf("File %s is not readable.n", filepath); } // 檢查文件是否可寫 if (access(filepath, W_OK) == 0) { printf("File %s is writable.n", filepath); } else { printf("File %s is not writable.n", filepath); } // 檢查文件是否可執行 if (access(filepath, X_OK) == 0) { printf("File %s is executable.n", filepath); } else { printf("File %s is not executable.n", filepath); }} int main() { const char *filepath = "example.txt"; check_access(filepath); return 0;}
注意事項:
access 函數是基于真實用戶 ID 和組 ID 進行檢查的,而不是有效用戶 ID 和組 ID。
由于文件權限可能會在檢查后立即變化,因此使用 access 來進行安全性檢查時要格外小心。
盡量避免在實際操作前僅用 access 檢查權限,而應該直接處理文件操作,并檢查返回值。
4
chmod函數
chmod 函數用于更改文件的訪問權限。它可以修改文件的讀、寫、執行權限。
函數原型如下:
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h> int chmod(const char *pathname, mode_t mode);
參數說明:
pathname:要更改權限的文件或目錄的路徑。
mode:新的文件模式(權限),由一些按位或(OR)組合的位組成。常用的模式有:
S_IRUSR:文件所有者具有讀權限。
S_IWUSR:文件所有者具有寫權限。
S_IXUSR:文件所有者具有執行權限。
S_IRGRP:文件組用戶具有讀權限。
S_IWGRP:文件組用戶具有寫權限。
S_IXGRP:文件組用戶具有執行權限。
S_IROTH:其他用戶具有讀權限。
S_IWOTH:其他用戶具有寫權限。
S_IXOTH:其他用戶具有執行權限。
這些常量可以通過按位或(|)組合在一起,形成一個完整的模式。
返回值:
成功時返回 0。
失敗時返回 -1,并設置 errno 以指示錯誤。
以下是一個示例程序,演示如何使用 chmod 函數更改文件的訪問權限。
#include <stdio.h>#include <sys/stat.h> int main() { const char *filepath = "example.txt"; // 更改文件權限為所有者可讀可寫,組用戶和其他用戶只讀 if (chmod(filepath, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == 0) { printf("Changed permissions successfully.n"); } else { perror("chmod"); } return 0;}
在這個示例中,chmod 函數被調用以更改文件 example.txt 的權限。新權限設置為:
文件所有者具有讀(S_IRUSR)和寫(S_IWUSR)權限。
文件組用戶具有讀(S_IRGRP)權限。
其他用戶具有讀(S_IROTH)權限。
文件權限是通過模式位的組合來指定的。常用的模式位有:
S_IRUSR (0400):文件所有者讀權限。
S_IWUSR (0200):文件所有者寫權限。
S_IXUSR (0100):文件所有者執行權限。
S_IRGRP (0040):文件組用戶讀權限。
S_IWGRP (0020):文件組用戶寫權限。
S_IXGRP (0010):文件組用戶執行權限。
S_IROTH (0004):其他用戶讀權限。
S_IWOTH (0002):其他用戶寫權限。
S_IXOTH (0001):其他用戶執行權限。
例如,S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH 組合了所有者的讀寫權限和組用戶與其他用戶的讀權限,結果權限為 0644。
如果 chmod 成功,則返回 0,否則返回 -1,并在標準錯誤流中輸出錯誤信息。使用 perror 函數打印錯誤原因。
chmod 函數是一個強大的工具,可以方便地更改文件的訪問權限。正確使用它可以提高系統的安全性和文件管理的效率。在使用時,要注意權限的合理設置,以防止權限過高或過低帶來的安全隱患。常見錯誤如下:
EACCES:權限不足,無法更改文件權限。
EPERM:操作不被允許,例如試圖更改系統文件的權限。
ENOENT:指定的文件不存在。
ENOTDIR:指定的路徑中有不是目錄的部分。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。