电子产业一站式赋能平台

PCB联盟网

搜索
查看: 217|回复: 0
收起左侧

嵌入式Linux:文件访问权限

[复制链接]

679

主题

679

帖子

2524

积分

三级会员

Rank: 3Rank: 3

积分
2524
发表于 2024-7-16 13:05:00 | 显示全部楼层 |阅读模式

vfcgf3dnapy64020940.gif

vfcgf3dnapy64020940.gif

点击上方蓝色字体,关注我们
在 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

    ytlwipamwxw64021040.png

    ytlwipamwxw64021040.png


    输出的第一列包含 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.txt2.2、八进制表示法
    八进制表示法使用三个八进制数字来表示所有者、组和其他用户的权限。

    每个权限有一个相应的值:
  • 读取(r):4
  • 写入(w):2
  • 执行(x):1

    示例如下:

  • # 设置所有者读写执行,组读执行,其他用户只读$ chmod 754 example.txt
    # 设置所有用户读写执行权限$ chmod 777 example.txt
    3
    access函数
    access 函数用于检查调用进程是否有权限访问指定的文件或目录。它可以用来判断一个文件是否存在,以及检查读、写、执行权限。

    函数原型如下:

  • #include
    int access(const char *pathname, int mode);
    参数说明:
  • pathname:要检查的文件或目录的路径。
  • mode:要检查的权限,可以是以下常量的组合:
  • F_OK:检查文件是否存在。
  • R_OK:检查文件是否可读。
  • W_OK:检查文件是否可写。
  • X_OK:检查文件是否可执行。

    返回值:
  • 如果调用进程具有指定的访问权限,则返回 0。
  • 如果调用进程不具有指定的访问权限,或者出错,则返回 -1,并设置 errno 以指示错误。

    以下是一个示例程序,它使用 access 函数检查文件的各种访问权限。

  • #include #include
    void check_access(const char *filepath) {    // 检查文件是否存在    if (access(filepath, F_OK) == 0) {        printf("File %s exists.
    ", filepath);    } else {        printf("File %s does not exist.
    ", filepath);        return;    }
        // 检查文件是否可读    if (access(filepath, R_OK) == 0) {        printf("File %s is readable.
    ", filepath);    } else {        printf("File %s is not readable.
    ", filepath);    }
        // 检查文件是否可写    if (access(filepath, W_OK) == 0) {        printf("File %s is writable.
    ", filepath);    } else {        printf("File %s is not writable.
    ", filepath);    }
        // 检查文件是否可执行    if (access(filepath, X_OK) == 0) {        printf("File %s is executable.
    ", filepath);    } else {        printf("File %s is not executable.
    ", filepath);    }}
    int main() {    const char *filepath = "example.txt";    check_access(filepath);    return 0;}

    注意事项:
  • access 函数是基于真实用户 ID 和组 ID 进行检查的,而不是有效用户 ID 和组 ID。
  • 由于文件权限可能会在检查后立即变化,因此使用 access 来进行安全性检查时要格外小心。
  • 尽量避免在实际操作前仅用 access 检查权限,而应该直接处理文件操作,并检查返回值。

    4
    chmod函数
    chmod 函数用于更改文件的访问权限。它可以修改文件的读、写、执行权限。
    函数原型如下:

  • #include #include #include
    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 #include
    int main() {    const char *filepath = "example.txt";
        // 更改文件权限为所有者可读可写,组用户和其他用户只读    if (chmod(filepath, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == 0) {        printf("Changed permissions successfully.
    ");    } 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:指定的路径中有不是目录的部分。


    rtg50zngfey64021140.jpg

    rtg50zngfey64021140.jpg

    mvjb2x2nfom64021240.gif

    mvjb2x2nfom64021240.gif

    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表