博客專欄

        EEPW首頁 > 博客 > 嵌入式Linux:文件訪問權(quán)限

        嵌入式Linux:文件訪問權(quán)限

        發(fā)布人:美男子玩編程 時(shí)間:2024-08-21 來源:工程師 發(fā)布文章

        在 Linux 中,文件訪問權(quán)限決定了哪些用戶和用戶組可以讀取、寫入或執(zhí)行文件。這些權(quán)限通過文件系統(tǒng)中的元數(shù)據(jù)來定義,并且可以使用多種工具進(jìn)行查看和更改。


        每個(gè)文件和目錄都有三個(gè)不同的權(quán)限級別:

        • 所有者(Owner):文件或目錄的創(chuàng)建者。

        • 用戶組(Group):與文件或目錄相關(guān)聯(lián)的用戶組。

        • 其他用戶(Others):系統(tǒng)中的其他所有用戶。


        每個(gè)級別都有三個(gè)權(quán)限:

        • 讀取(Read, r):允許讀取文件內(nèi)容或列出目錄內(nèi)容。

        • 寫入(Write, w):允許修改文件內(nèi)容或創(chuàng)建、刪除目錄中的文件。

        • 執(zhí)行(Execute, x):允許執(zhí)行文件(對于目錄,允許進(jìn)入該目錄)。


        1


        查看文件權(quán)限

        使用 ls -l 命令可以查看文件和目錄的權(quán)限。例如:




        $ ls -l-rw-r--r-- 1 user group 1234 Jan 1 12:34 example.txt

        圖片


        輸出的第一列包含 10 個(gè)字符,代表文件類型和權(quán)限:

        • 第一個(gè)字符:文件類型(- 表示普通文件,d 表示目錄,l 表示符號(hào)鏈接等)。

        • 后面九個(gè)字符:每組三個(gè)字符,分別表示所有者、組和其他用戶的權(quán)限。


        在這個(gè)示例中,-rw-r--r-- 表示:

        • 所有者:rw-(讀和寫)

        • 用戶組:r--(只讀)

        • 其他用戶:r--(只讀)


        2


        修改文件權(quán)限

        使用 chmod 命令可以更改文件或目錄的權(quán)限。有兩種方式:符號(hào)表示法和八進(jìn)制表示法。


        2.1、符號(hào)表示法

        符號(hào)表示法使用 +、- 和 = 操作符來添加、移除或設(shè)置權(quán)限。


        示例如下:













        # 為所有者添加執(zhí)行權(quán)限$ chmod u+x example.txt
        # 為用戶組添加寫權(quán)限$ chmod g+w example.txt
        # 為其他用戶移除讀權(quán)限$ chmod o-r example.txt
        # 為所有用戶設(shè)置讀取權(quán)限$ chmod a=r example.txt

        2.2、八進(jìn)制表示法 

        八進(jìn)制表示法使用三個(gè)八進(jìn)制數(shù)字來表示所有者、組和其他用戶的權(quán)限。


        每個(gè)權(quán)限有一個(gè)相應(yīng)的值:

        • 讀取(r):4

        • 寫入(w):2

        • 執(zhí)行(x):1


        示例如下:







        # 設(shè)置所有者讀寫執(zhí)行,組讀執(zhí)行,其他用戶只讀$ chmod 754 example.txt
        # 設(shè)置所有用戶讀寫執(zhí)行權(quán)限$ chmod 777 example.txt

        3


        access函數(shù)

        access 函數(shù)用于檢查調(diào)用進(jìn)程是否有權(quán)限訪問指定的文件或目錄。它可以用來判斷一個(gè)文件是否存在,以及檢查讀、寫、執(zhí)行權(quán)限。


        函數(shù)原型如下:





        #include <unistd.h>
        int access(const char *pathname, int mode);


        參數(shù)說明:

        • pathname:要檢查的文件或目錄的路徑。

        • mode:要檢查的權(quán)限,可以是以下常量的組合:

          • F_OK:檢查文件是否存在。

          • R_OK:檢查文件是否可讀。

          • W_OK:檢查文件是否可寫。

          • X_OK:檢查文件是否可執(zhí)行。


        返回值:

        • 如果調(diào)用進(jìn)程具有指定的訪問權(quán)限,則返回 0。

        • 如果調(diào)用進(jìn)程不具有指定的訪問權(quán)限,或者出錯(cuò),則返回 -1,并設(shè)置 errno 以指示錯(cuò)誤。


        以下是一個(gè)示例程序,它使用 access 函數(shù)檢查文件的各種訪問權(quán)限。










































        #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);    }
            // 檢查文件是否可執(zhí)行    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;}


         注意事項(xiàng):

        • access 函數(shù)是基于真實(shí)用戶 ID 和組 ID 進(jìn)行檢查的,而不是有效用戶 ID 和組 ID。

        • 由于文件權(quán)限可能會(huì)在檢查后立即變化,因此使用 access 來進(jìn)行安全性檢查時(shí)要格外小心。

        • 盡量避免在實(shí)際操作前僅用 access 檢查權(quán)限,而應(yīng)該直接處理文件操作,并檢查返回值。


        4


        chmod函數(shù)

        chmod 函數(shù)用于更改文件的訪問權(quán)限。它可以修改文件的讀、寫、執(zhí)行權(quán)限。

        函數(shù)原型如下:







        #include <sys/types.h>#include <sys/stat.h>#include <unistd.h>
        int chmod(const char *pathname, mode_t mode);


         參數(shù)說明:

        • pathname:要更改權(quán)限的文件或目錄的路徑。

        • mode:新的文件模式(權(quán)限),由一些按位或(OR)組合的位組成。常用的模式有:

          • S_IRUSR:文件所有者具有讀權(quán)限。

          • S_IWUSR:文件所有者具有寫權(quán)限。

          • S_IXUSR:文件所有者具有執(zhí)行權(quán)限。

          • S_IRGRP:文件組用戶具有讀權(quán)限。

          • S_IWGRP:文件組用戶具有寫權(quán)限。

          • S_IXGRP:文件組用戶具有執(zhí)行權(quán)限。

          • S_IROTH:其他用戶具有讀權(quán)限。

          • S_IWOTH:其他用戶具有寫權(quán)限。

          • S_IXOTH:其他用戶具有執(zhí)行權(quán)限。


        這些常量可以通過按位或(|)組合在一起,形成一個(gè)完整的模式。


        返回值:

        • 成功時(shí)返回 0。

        • 失敗時(shí)返回 -1,并設(shè)置 errno 以指示錯(cuò)誤。


        以下是一個(gè)示例程序,演示如何使用 chmod 函數(shù)更改文件的訪問權(quán)限。

















        #include <stdio.h>#include <sys/stat.h>
        int main() {    const char *filepath = "example.txt";
            // 更改文件權(quán)限為所有者可讀可寫,組用戶和其他用戶只讀    if (chmod(filepath, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == 0) {        printf("Changed permissions successfully.n");    } else {        perror("chmod");    }
            return 0;}


        在這個(gè)示例中,chmod 函數(shù)被調(diào)用以更改文件 example.txt 的權(quán)限。新權(quán)限設(shè)置為:

        • 文件所有者具有讀(S_IRUSR)和寫(S_IWUSR)權(quán)限。

        • 文件組用戶具有讀(S_IRGRP)權(quán)限。

        • 其他用戶具有讀(S_IROTH)權(quán)限。


        文件權(quán)限是通過模式位的組合來指定的。常用的模式位有:

        • S_IRUSR (0400):文件所有者讀權(quán)限。

        • S_IWUSR (0200):文件所有者寫權(quán)限。

        • S_IXUSR (0100):文件所有者執(zhí)行權(quán)限。

        • S_IRGRP (0040):文件組用戶讀權(quán)限。

        • S_IWGRP (0020):文件組用戶寫權(quán)限。

        • S_IXGRP (0010):文件組用戶執(zhí)行權(quán)限。

        • S_IROTH (0004):其他用戶讀權(quán)限。

        • S_IWOTH (0002):其他用戶寫權(quán)限。

        • S_IXOTH (0001):其他用戶執(zhí)行權(quán)限。


        例如,S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH 組合了所有者的讀寫權(quán)限和組用戶與其他用戶的讀權(quán)限,結(jié)果權(quán)限為 0644。


        如果 chmod 成功,則返回 0,否則返回 -1,并在標(biāo)準(zhǔn)錯(cuò)誤流中輸出錯(cuò)誤信息。使用 perror 函數(shù)打印錯(cuò)誤原因。


        chmod 函數(shù)是一個(gè)強(qiáng)大的工具,可以方便地更改文件的訪問權(quán)限。正確使用它可以提高系統(tǒng)的安全性和文件管理的效率。在使用時(shí),要注意權(quán)限的合理設(shè)置,以防止權(quán)限過高或過低帶來的安全隱患。常見錯(cuò)誤如下:

        • EACCES:權(quán)限不足,無法更改文件權(quán)限。

        • EPERM:操作不被允許,例如試圖更改系統(tǒng)文件的權(quán)限。

        • ENOENT:指定的文件不存在。

        • ENOTDIR:指定的路徑中有不是目錄的部分。

        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: 嵌入式 Linux

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 星子县| 乡宁县| 佛教| 胶南市| 石林| 治县。| 黑山县| 石泉县| 长春市| 阳西县| 赫章县| 新宾| 黎城县| 行唐县| 清水河县| 鹤峰县| 开封市| 富阳市| 岳西县| 嘉兴市| 鄂尔多斯市| 天等县| 仪征市| 珲春市| 敦化市| 聂拉木县| 郴州市| 宁化县| 油尖旺区| 元阳县| 铜山县| 喀什市| 临颍县| 客服| 瑞金市| 广安市| 门头沟区| 敦化市| 公安县| 象州县| 南宁市|