嵌入式Linux系统编程 — 3.3 chown、fchown 和 lchown 函数更改文件属主

目录

1 文件属主

1.1 文件属主概念

1.2 如何查看文件属主 

1.3 有效用户 ID 和有效组 ID

2 chown 函数

2.1 chown命令

2.2 chown函数

2.3 getuid 和 getgid函数 

3 fchown函数

3.1 fchown函数简介

3.2 示例代码

4 lchown函数 


1 文件属主

1.1 文件属主概念

Linux 是一个支持多用户操作的系统,它允许多个用户在同一台机器上工作,而每个文件都与特定的用户和用户组相关联,通过这个信息可以判断文件的所有者和所属组。

文件所有者指的是文件的拥有者,即文件属于哪个用户。通常,文件在创建时,其所有者就是创建它的用户。例如,如果当前登录用户为 ***,通过 touch 命令创建了文件,那么文件的所有者就是 ***。同样,当程序通过 open 函数创建新文件时,文件的所有者将是执行该程序的用户。

文件所属组则指明了文件属于哪个用户组。Linux 系统通过用户 ID(UID)和组 ID(GID)来识别用户和用户组,而不是通过用户名或组名。每个用户和用户组都被分配了一个唯一的 ID,系统通过这些 ID 来管理权限和访问控制。

用户 ID 简称 UID、用户组 ID 简称 GID, 这些都是 Linux 操作系统的基础知识,

1.2 如何查看文件属主 

可以使用 ls 命令或 stat 命令便可以查看到文件的所有者和所属组,如下所示:


文件的用户 ID 和组 ID 分别由 struct stat 结构体中的 st_uid 和 st_gid 所指定。 既然 Linux 下的每一个文件都有与之相关联的用户 ID 和组 ID,那么对于一个进程来说亦是如此,与一个进程相关联的 ID 有很多:

  • 实际用户 ID 和实际组 ID 标识该进程的用户是谁、以及该用户对应的所属组; 实际用户 ID 和实际组 ID 确定了进程所属的用户和组。
  • 进程的有效用户 ID、有效组 ID 以及附属组 ID 用于文件访问权限检查。

1.3 有效用户 ID 和有效组 ID

首先对于有效用户 ID 和有效组 ID 来说,这是进程里面的概念,文件来并无此属性!有效用户 ID 和有效组 ID 是操作系统层面,用于给操作系统判断当前执行该进程的用户在当前环境下对某个文件是否拥有相应的权限。

在 Linux 系统中,当进程对文件进行读写操作时,系统首先会判断该进程是否具有对该文件的读写权限,那如何判断呢?自然是通过该文件的权限位来判断, struct stat 结构体中的 st_mode 字段中就记录了该文件的权限位以及文件类型。

当进行权限检查时,并不是通过进程的实际用户和实际组来参与权限检查的,而是通过有效用户和有效组来参与文件权限检查。 通常, 绝大部分情况下,进程的有效用户等于实际用户(有效用户 ID 等于实际用户 ID) ,有效组等于实际组(有效组 ID 等于实际组 ID) 。

 

2 chown 函数

2.1 chown命令

chown 是一个系统调用,该系统调用可用于改变文件的所有者(用户 ID)和所属组(组 ID) 。其实在Linux 系统下也有一个 chown 命令,该命令的作用也是用于改变文件的所有者和所属组,例如将文件的所有者和所属组修改为 root:

通过chown 该命令确实可以改变文件的所有者和所属组,这个命令内部其实就是调用了chown 函
数来实现功能的, chown 函数原理如下所示。

2.2 chown函数

chown 函数在编程中使用的一个系统调用,用于改变文件或目录的用户和组所有权,chown 函数的原型如下:

#include <sys/types.h>
#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
  • path: 要改变所有权的文件或目录的路径。
  • owner: 新的所有者的用户 ID (UID)。
  • group: 新的组的组 ID (GID)。

虽然该函数用法很简单,但是有以下两个限制条件:

  • 只有超级用户进程能更改文件的用户 ID;
  • 普通用户进程可以将文件的组 ID 修改为其所从属的任意附属组 ID,前提条件是该进程的有效用户 ID 等于文件的用户 ID;而超级用户进程可以将文件的组 ID 修改为任意值。

所以,由此可知,文件的用户 ID 和组 ID 并不是随随便便就可以更改的,其实这种设计是为系统安全着想,如果系统中的任何普通用户进程都可以随便更改系统文件的用户 ID 和组 ID,那么也就意味着任何普通用户对系统文件都有任意权限了,这对于操作系统来说将是非常不安全的。

下面是一个简单的 C 语言示例程序,演示如何使用 chown 函数来改变文件的所有者和组。这个示例程序尝试将指定文件的所有者和组更改为特定的用户 ID 和组 ID。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    // 检查命令行参数数量
    if (argc != 4) {
        fprintf(stderr, "Usage: %s <file> <owner> <group>\n", argv[0]);
        return 1;
    }

    const char *file = argv[1]; // 文件路径
    uid_t owner = atoi(argv[2]); // 新的所有者用户 ID
    gid_t group = atoi(argv[3]); // 新的组 ID

    // 使用 chown 函数改变文件的所有者和组
    if (chown(file, owner, group) == -1) {
        // 如果 chown 失败,打印错误消息
        perror("chown failed");
        return 1;
    }

    printf("Ownership of '%s' changed to owner %d, group %d\n", file, owner, group);
    return 0;
}

程序接收三个命令行参数:要改变所有权的文件的路径,新的所有者的用户 ID,以及新的组 ID。使用 atoi 函数将用户和组 ID 的字符串转换为整数。使用 chown 函数尝试改变文件的所有权。如果 chown 函数调用失败,perror 函数将打印错误消息,程序返回 1。如果成功,程序将打印一条消息,表明所有权已更改。运行结果如下:

2.3 getuid 和 getgid函数 

在 Linux 系统下,可以使用 getuid 和 getgid 两个系统调用分别用于获取当前进程的用户 ID 和用户组ID,这里说的进程的用户 ID 和用户组 ID 指的就是进程的实际用户 ID 和实际组 ID,这两个系统调用函数原型如下所示:

#include <unistd.h> 

uid_t getuid(void);
  • 返回值:返回当前进程的实际用户 ID。如果发生错误,返回 -1 并设置 errno
#include <unistd.h> gid_t getgid(void);
  • 返回值:返回当前进程的实际组 ID。如果发生错误,返回 -1 并设置 errno

下面是一个简单的示例,展示如何使用 getuidgetgid 函数:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    uid_t my_uid = getuid();
    gid_t my_gid = getgid();

    printf("Current User ID: %d\n", my_uid);
    printf("Current Group ID: %d\n", my_gid);

    return 0;
}

 程序运行结果如下:

 

3 fchown函数

3.1 fchown函数简介

fchown 用于改变一个打开文件描述符的所有权。这个函数允许你更改文件的用户 ID (owner) 和组 ID (group),而不需要知道文件的路径名。fchown 函数的原型如下:

#include <unistd.h>

int fchown(int fd, uid_t owner, gid_t group);
  • fd: 要改变所有权的文件的文件描述符。
  • owner: 新的所有者的用户 ID (UID)。
  • group: 新的组的组 ID (GID)。

3.2 示例代码

下面是一个使用 fchown 函数的示例程序:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>

int main() {
    int fd = open("example.txt", O_RDONLY); // 打开文件以读取模式
    if (fd == -1) {
        perror("open");
        return 1;
    }

    uid_t new_uid = 1000; // 新用户 ID
    gid_t new_gid = 1000; // 新组 ID

    if (fchown(fd, new_uid, new_gid) == -1) {
        perror("fchown");
        close(fd);
        return 1;
    }

    printf("Changed ownership of file descriptor %d to owner %d, group %d\n", fd, new_uid, new_gid);
    close(fd); // 关闭文件描述符
    return 0;
}

程序首先打开一个名为 "example.txt" 的文件,然后尝试使用 fchown 函数改变该文件的所有权。运行结果如下: 

4 lchown函数 

lchown 函数用于改变一个符号链接的所有者和组。与 chown 不同,lchown 专门用于符号链接,即使符号链接指向的目标文件的所有权被更改,lchown 也会更改符号链接本身的所有者和组。lchown 函数的原型如下:

#include <unistd.h>

int lchown(const char *path, uid_t owner, gid_t group);
  • path: 符号链接的路径。
  • owner: 新的所有者的用户 ID (UID)。
  • group: 新的组的组 ID (GID)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/691343.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高通SDX12:Voice Over USB 功能调试

一、功能概述及使用环境 Linux PC 作为上位机,内置 SLIC基于高通 SDX12 平台的设备作为从设备,通过USB连接到 Linux PC 上,在 PC 上枚举 UAC 设备从设备进行 MO/MT Call 时,上位机使用 arecord 进行录音,音频数据通过 USB 传至上位机,上位机停止录音后再使用 aplay 进行播…

idea debug时提示”Method breakpoints may dramatically slow down debugging“的解决办法

问题现象 今天同事喊我过去看一个问题&#xff0c;项目正常启动的时候没问题&#xff0c;debug模式就卡住了&#xff0c;很久不动。我推测是哪个断点导致的&#xff0c;一看断点果然有情况。在方法上打了断点。 解决方式(Android Studio一样的解决&#xff09; 1、View Brea…

责任链模式(行为型)

目录 一、前言 二、责任链模式 三、总结 一、前言 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;也叫职责链模式&#xff0c;是一种行为型设计模式&#xff0c;职责链模式使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦…

机器学习--损失函数

损失函数&#xff08;Loss Function&#xff09;&#xff0c;也称为代价函数&#xff08;Cost Function&#xff09;或误差函数&#xff08;Error Function&#xff09;&#xff0c;是机器学习和统计学中的一个重要概念。它用于量化模型预测值与真实值之间的差异。损失函数的值…

毫米波雷达深度学习技术-1.6目标识别2

1.6.4 自动编码器和变体自动编码器 自编码器包括一个编码器神经网络&#xff0c;随后是一个解码器神经网络&#xff0c;其目的是在输出处重建输入数据。自动编码器的设计在网络中施加了一个瓶颈&#xff0c;它鼓励原始输入的压缩表示。通常&#xff0c;自编码器旨在利用数据中的…

Spring boot项目

一. Spring boot 安装地址 https://start.spring.io/ 二. 选择 三. idea配置 找到下载的文件解压缩&#xff0c;打开pom.xml(选择从idea打开)

Shell以及Shell编程

Shell的任务 ①分析命令&#xff1b; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制&#xff1b; ③搜索命令并执行。 内部命令&#xff1a;内嵌在Shell中。 外部命令&#xff1a;存在于磁盘上的独立可执行文件。 #&#xff01;/bin/bash #! 称为一个幻数&…

【Vue3】理解toRef() 和 toRefs()

历史小剧场 知道可能面对的困难和痛苦&#xff0c;在死亡的恐惧中不断挣扎&#xff0c;却仍然能战胜自己&#xff0c;选择这条道路&#xff0c;这才是真正的勇气。----《明朝那些事儿》 前言 toRef 和 toRefs 是Vue3中的响应式转换工具函数 toRef: 不影响源对象的情况下&#x…

DIO控制卡,IRIG-B码卡,PCI-E总线接口卡,百兆数据采集卡

DIO控制卡 ● 4路继电器输出&#xff08;5A250VAC&#xff09; ● 4路开关量输入&#xff08;24VDC&#xff09; ● 1路IDE接口 ● 端口浪涌保护 IRIG-B码卡 ● 1路IRIG-B对时接口&#xff08;RS485/光纤&#xff09; ● 1路IEEE1588 V2对时接口&#xff08;RJ45/光纤&#…

Python在股票交易分析中的应用:布林带与K线图的实战回测

引言 在股票交易的世界中&#xff0c;技术分析是投资者们用来预测市场动向的重要工具。布林带&#xff08;Bollinger Bands&#xff09;作为一种动态波动范围指标&#xff0c;因其直观性和实用性而广受欢迎。本文将通过Python代码&#xff0c;展示如何使用布林带结合K线图来分…

数据结构之计数排序算法【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

【python报错】TypeError: dict.get() takes no keyword arguments

【Python报错】TypeError: dict.get() takes no keyword arguments 在Python中&#xff0c;字典&#xff08;dict&#xff09;是一种非常灵活的数据结构&#xff0c;用于存储键值对。dict.get()方法是用来从字典中获取与给定键&#xff08;key&#xff09;相关联的值&#xff0…

WordPress网站更换域名后如何重新激活elementor

在创建WordPress网站时&#xff0c;我们常常需要更改域名。但是&#xff0c;在更换域名后&#xff0c;你可能会遇到一个问题&#xff1a;WordPress后台中的Elementor插件授权状态会显示为不匹配。这时&#xff0c;就需要重新激活Elementor插件的授权。下面我会详细说明如何操作…

数据结构之ArrayList与顺序表(下)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 ArrayList的具体使用 118. 杨辉三角 扑克洗牌算法 接上篇&#xff1a;数据结构之ArrayLis…

mqtt-emqx:简单安装emqx

安装依赖 yum install -y epel-release libatomic下载 cd /chz/install/emqx wget https://www.emqx.com/en/downloads/broker/5.7.0/emqx-5.7.0-el7-amd64.tar.gz解压 mkdir -p emqx && tar -zxvf emqx-5.7.0-el7-amd64.tar.gz -C emqx后台运行 cd /chz/install/e…

ChatGPT-4o体验demo

OpenAI 最近推出了其最新的人工智能语言模型——GPT-4O。该模型是在原有 GPT-4 的基础上进行优化而成&#xff0c;旨在提升生成质量和响应速度。GPT-4O 采用了更加高效的架构设计&#xff0c;使其在处理复杂文本时表现出更快的速度和更高的准确性。GPT-4O 在训练过程中融入了最…

【每日刷题】Day59

【每日刷题】Day59 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1103. 分糖果 II - 力扣&#xff08;LeetCode&#xff09; 2. 1051. 高度检查器 - 力扣&#xff08…

C语言详解(动态内存管理)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

CTF Show MISC做题笔记

MISCX 30 题目压缩包为misc2.rar,其中包含三个文件:misc1.zip, flag.txt, hint.txt。其中后两个文件是加密的。 先解压出misc1.zip, 发现其中包含两个文件&#xff1a;misc.png和music.doc。其中后面文件是加密的。 解压出misc.png,发现图片尾部有消息&#xff1a;flag{flag…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP