嵌入式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]); // 新的所有者用户 IDgid_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; // 新用户 IDgid_t new_gid = 1000; // 新组 IDif (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.mzph.cn/pingmian/25037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tkinter颜色选择器

tkinter颜色选择器 颜色选择器效果代码 颜色选择器 Tkinter 提供了一个简单易用的颜色选择器模块 colorchooser&#xff0c;通过调用 colorchooser.askcolor() 方法&#xff0c;我们可以轻松实现颜色选择功能。 效果 代码 import tkinter as tk from tkinter import colorch…

angularJS资料

return home 目录结构 文章目录 [toc]angular4工作angular2下arcgis开发angular2相关资料BootstrapJavaScriptJavaScript视频教程 TypeScriptHTML CSS菜鸟教程 http://www.runoob.com/手册网 http://www.shouce.ren/w3school http://www.w3school.com.cn/ angular4 angular-CLI…

CSS函数: translate、translate3d的使用

translate()和translate3d()函数可以实现元素在指定轴的平移的功能。函数使用在CSS转换属性transform的属性值。实现转换的函数类型有&#xff1a; translate()&#xff1a;2D平面实现X轴、Y轴的平移translate3d()&#xff1a;3D空间实现位置的平移translateX()&#xff1a;实…

LLVM Cpu0 新后端4

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1V_tZkt9uvxo5bnUufhMQ_Q?…

向量数据库是什么?

向量数据库是什么&#xff1f; 随着人工智能和机器学习技术的迅猛发展&#xff0c;向量数据库作为一种新型数据库引起了广泛关注。向量数据库专门用于存储和查询高维向量数据&#xff0c;是在大规模数据检索和相似性搜索领域的重要工具。 向量数据库的定义 向量数据库是一种…

#09 Stable Diffusion动画制作入门

文章目录 前言1. 理解Stable Diffusion2. 动画制作的基本概念3. 准备阶段3.1 设计文本提示3.2 选择参数 4. 制作过程4.1 生成图像序列4.2 合成动画 5. 后期处理5.1 调色和特效5.2 输出格式 6. 最佳实践结论 前言 随着AI技术的飞速发展&#xff0c;Stable Diffusion作为一种先进…

定时清理Linux服务器缓存shell脚本

服务器内存占用过高,如何定时清理一下服务器内存呢?写一个清理缓存脚本,加入到定时任务中。 一、编写脚本 clear_cache.sh 脚本,放到home目录下。 #!/bin/bash# 清除页面缓存、目录项和 inode 缓存 sudo sync echo 3 | sudo tee /proc/sys/vm/drop_caches# 记录执行时间到日…

为下一波创新做准备:人工智能和元宇宙

人工智能和元宇宙的发展带来了独特的可能性和挑战。随着这些技术的发展&#xff0c;我们进入了一个沉浸式虚拟体验和智能系统的时代&#xff0c;我们正站在一个历史性的时刻。为迎接下一波创新&#xff0c;采取必要的措施是很重要的。 我们正在见证两项变革性技术的激动人心的发…

qt中网络编程关于QNetworkReply导致崩溃

现场项目上线之后&#xff0c;使用中总是闪退&#xff0c;release版本exe不好查找问题&#xff0c;困扰了我好几天&#xff0c;最后发现导致问题的可能点是&#xff1a;由于请求的网址都是一样的&#xff0c;只是请求数据不一样&#xff0c;所以只使用了一个reply&#xff0c;即…

数据赋能(113)——体系:监控数据采集——实施过程、应用特点

实施过程 监控数据采集的实施过程通常包括以下步骤&#xff1a; 明确监控目标&#xff1a;需要明确监控数据的采集目标&#xff0c;包括需要监控哪些数据、监控的目的以及预期的监控效果。确定监控数据源&#xff1a;确定监控数据来源&#xff0c;这包括各种数据库、网络设备…

WebSocket前端分页:技术深度、实践困境与未来展望

WebSocket前端分页&#xff1a;技术深度、实践困境与未来展望 在前端开发的广阔领域中&#xff0c;WebSocket前端分页技术以其独特的优势逐渐崭露头角。它不仅为开发者带来了全新的交互体验&#xff0c;也为用户带来了更加流畅和高效的信息获取方式。然而&#xff0c;这一技术…

以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】

【Less-54】 与前面的题目不同是&#xff0c;这里只能提交10次&#xff0c;一旦提交超过十次&#xff0c;数据会重新刷新&#xff0c;所有的步骤需要重来一次。 解题步骤&#xff1a; 根据测试&#xff0c;使用的是单引号闭合。 # 判断字段的数量 ?id1 order by 3 -- aaa# …

WPF视频学习-基础知识篇

1.简介WPF&#xff1a; C# 一套关于windows界面应用开发框架 2.WPF和winform的差别 &#xff0c;(WPF比较新) 创建新项目使用模板&#xff1a; WPF使用.xaml后缀&#xff0c;双击可查看操作界面和设置代码&#xff0c;其文件展开之后中有MainWindow.xaml.cs为程序交互逻辑。…

云上小知识:企业选择云服务的小Tips

企业在选择云服务模式时&#xff0c;应综合考虑以下几个关键因素&#xff1a; 1. 业务需求与场景 企业需要根据自身的业务特点和需求来选择合适的云服务模式。例如&#xff0c;如果企业的用户分布广泛&#xff0c;需要跨地域提供服务&#xff0c;那么公有云可能是更好的选择。…

【Python】数据处理:文本文件操作

在Python中&#xff0c;处理文本文件是非常常见的任务。可以使用内置的open函数来打开、读取和写入文本文件。 打开文件 使用open函数打开文件。该函数有两个主要参数&#xff1a; open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, ope…

Windows 批处理(bat) 中文件操作使用教程

文章目录 dir&#xff1a;列出当前目录下的文件和子目录cd&#xff1a;改变当前目录md 或 mkdir&#xff1a;创建新目录rd 或 rmdir&#xff1a;删除目录del&#xff1a;删除一个或多个文件copy&#xff1a;复制文件到另一个位置xcopy&#xff1a;用于复制目录及其内容到另一个…

#08 文本到图像转换:Stable Diffusion的创意应用

文章目录 前言1. 文本提示的艺术1.1 创意描述1.2 故事叙述 2. 图像生成的技巧2.1 参数调整2.2 风格迁移 3. 创意应用实例3.1 艺术创作3.2 商业设计3.3 社交媒体内容 4. 实践指南4.1 实验与迭代4.2 学习与借鉴4.3 版权与伦理 结论 前言 Stable Diffusion作为一种先进的AI图像生…

mysqldump常用备份数据库命令

mysqldump 是 MySQL 数据库的官方命令行备份工具。以下是一些常用的 mysqldump 数据库备份命令示例&#xff1a; 备份单个数据库&#xff1a; mysqldump -u username -p database_name > database_name_backup.sql这里 username 是你的数据库用户名&#xff0c;database_nam…

JVM:Java虚拟机探秘

JVM&#xff1a;Java虚拟机探秘 简介 Java Virtual Machine&#xff08;JVM&#xff09;&#xff0c;作为Java技术的核心&#xff0c;是一个抽象化的计算模型&#xff0c;负责执行Java字节码。它不仅为Java程序提供了跨平台运行的能力&#xff0c;还通过内存管理、垃圾回收、…

OmniGlue: Generalizable Feature Matching with Foundation Model Guidance

【引用格式】&#xff1a;Jiang H, Karpur A, Cao B, et al. OmniGlue: Generalizable Feature Matching with Foundation Model Guidance[J]. arXiv preprint arXiv:2405.12979, 2024. 【网址】&#xff1a;https://arxiv.org/pdf/2405.12979 【开源代码】&#xff1a;https…