Linux 中对文件的访问由文件权限、属性和所有权控制。 因此,只有授权的用户和进程才能访问文件和文件夹。本篇使用 chmod 命令更改文件和目录的访问权限。

Linux 文件权限

在这之前,让我们先了解一下 Linux 权限的基础知识。在 Linux 中,谁可以对文件或目录执行什么操作是通过权限集来控制的。 共有三组权限。 一组用于文件所有者,另一组用于文件组成员,最后一组用于其他所有人。

1、文件所有者
2、文件所在组
3、其他组

权限控制可以对文件或目录执行的操作。 它们要么允许或阻止文件被读取、修改,或者如果它是脚本或程序,则被执行。

查看和了解文件权限

要查看文件或目录设置了哪些权限,我们可以使用 ls 命令。

在每一行,第一个字符标识正在列出的条目的类型。 如果它是一个破折号 (-),它就是一个文件。 如果是字母 d 它是一个目录。

1、前三个字符显示拥有文件的用户的权限(用户权限)。
2、中间三个字符显示文件组成员的权限(组权限)。
3、最后三个字符显示不属于前两个类别的任何人的权限(其他权限)。

每组权限包含三个字符。 这些字符是存在或不存在权限之一的指示符。 它们是破折号 (-) 或字母。 如果字符是破折号,则表示未授予权限。 如果字符是 r、w 或 x,则已授予该权限。

r:读取权限。 可以打开文件并查看其内容。
w:写权限。 该文件可以被编辑、修改和删除。
x:执行权限。 如果文件是脚本或程序,则可以运行(执行)。

(rw-r–r--) 表示文件所有者有读写权限(rw-),而组和其他人只有读权限(r–)。

根据它们是设置为文件还是目录,三个权限三元组中的每一个都可以由以下字符组成,并具有不同的含义。

权限对文件的影响

权限 特点 文件上的含义
Read - 该文件不可读。 您无法查看文件内容。
r 该文件是可读的。
Write - 该文件不能更改或修改。
w 该文件可以更改或修改。
Execute - 该文件无法执行。
x 该文件可以执行。
s 如果在用户三元组中找到,它将设置 setuid 位。 如果在组三元组中找到,它会设置 setgid 位。 这也意味着设置了 x 标志。 在可执行文件上设置 setuid 或 setgid 标志时,将使用文件的所有者和/或组权限执行文件。
S 与 s 相同,但未设置 x 标志。 该标志很少用于文件。
t 如果在其他三元组中找到,它会设置粘性位。 这也意味着设置了 x 标志。 此标志对文件无用。
T 与 t 相同,但未设置 x 标志。 此标志对文件无用。

chmod命令的使用


chmod 命令的编写格式如下:

chmod [OPTIONS] MODE FILE…

chmod 命令允许您使用符号或数字模式以及参考文件来更改文件的权限。文件的权限只能由 root、文件所有者或具有 sudo 访问权限的用户更改。 使用 chmod 时要格外小心,尤其是在递归修改权限时。

符号模式的方法 :

使用符号模式时,chmod 命令的语法如下:

chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE…

第一组标志 ([ugoa…]) 定义了哪些用户的类的文件权限已更改。

u:User,意思是文件的所有者。
g:Group,表示文件所属组的成员。
o:Others,表示不受 u 和 g 权限约束的人。
a:All,意思是以上所有。

如果未指定用户的标志,则默认值为 a

操作标志,第二组标志 ([-+=]),确定是否要删除、添加或设置权限:

= - 将现有权限更改为提供的权限。 如果 = 符号后未指定任何权限,则删除指定用户类的所有权限。
- - 删除指定的权限。
+ - 添加指定的权限。

权限 (perms…) 可以通过输入零个或一个或多个字母 r、w、x、X、s 和 t 来明确建立。

在为多个用户类别([,…])定义权限时,使用逗号(无空格)分隔符号模式。

使用 chmod 命令的一些示例

我们可以使用以下命令添加执行权限:

chmod a+x 2022-2-20.log

如果我们看一下权限,我们会看到现在每个人都授予了执行权限,并且现有的权限仍然存在。

我们将文件所有者的权限添加到文件的组成员的权限中:

chmod g+u 2022-2-20.log

我们将授予组成员读取文件但不写入或执行文件的权限:

以递归方式删除所有其他用户的写权限:

授予文件所有者读取、写入和执行权限,以及对文件组的读取权限,而对其他所有人不授予权限:

数值方法

chmod 命令具有以下语法:

chmod [OPTIONS] NUMBER FILE…

可以在使用数字模式时同时为所有三个用户类别(所有者、组和所有其他)指定权限。

NUMBER 可以是三位数或四位数。使用三位数字时,第一位代表文件所有者的权限,第二位代表文件所属的组,第三位代表所有其他用户。为每个写入、读取和执行权限分配以下数值:

 r = 4 (read)w (write) = 2x (execute) = 1no permissions = 0

此处列出了可以使用的数字及其代表的含义:

 0: (000) 没有权限。1:(001)执行许可。2:(010)写权限。3:(011)写入和执行权限。4:(100)读取权限。5:(101)读取和执行权限。6:(110)读写权限。7:(111) 读取、写入和执行权限。

这三个权限中的每一个都由十进制数的二进制等效位中的一个位表示。 所以 5,即二进制的 101,表示读取和执行。 2,二进制010,表示写权限。

要为文件的所有者提供读取、写入和执行权限、对文件组的读取和执行权限以及对所有其他用户的读取权限,可以执行以下操作:

Owner: rwx=4+2+1=7
Group: r-x=4+0+1=5
Others: r-x=4+0+0=4

stat 命令检查权限

stat 命令可用于以数字形式检查文件的权限:

stat -c “%a” 2022-2-20.log

数字模式下,chmod命令使用示例

授予文件所有者读取、写入和执行权限,组成员读取和执行权限,以及所有其他用户不授予权限:

chmod 750 2022-2-20.log

授予文件所有者读写权限,但只授予组成员和其他用户读取权限:

递归地为文件所有者设置读、写和执行权限,而为目录上的所有其他用户设置无权限:

要将2022-2-20目录中所有文件和子目录的权限设置为 755,例如,键入:


chmod命令代码C/C++实现

要使用 chmod 设置权限,我们需要告诉它:

  • Who:我们为谁设置权限。
int who(void)
{register int m = 0;for (;;) switch (*ms++) {case 'u':m |= USER;continue;case 'g':m |= GROUP;continue;case 'o':m |= OTHER;continue;case 'a':m |= ALL;continue;default:ms--;if (m == 0)m = ALL & ~um;return m;}
}
  • What:我们正在做什么改变? 我们是添加还是删除权限?
int what()
{switch (*ms) {case '+':case '-':case '=':return *ms++;}return(0);
}
  • where:我们设置了哪些权限?
int where(register int om)
{register int m = 0;switch (*ms) {case 'u':m = (om & USER) >> 6;goto dup;case 'g':m = (om & GROUP) >> 3;goto dup;case 'o':m = (om & OTHER);dup:m &= (READ|WRITE|EXEC);m |= (m << 3) | (m << 6);++ms;return m;}for (;;) switch (*ms++) {case 'r':m |= READ;continue;case 'w':m |= WRITE;continue;case 'x':m |= EXEC;continue;case 's':m |= SETID;continue;case 't':m |= STICKY;continue;default:ms--;return m;}
}

我们使用指标来表示这些值,并形成简短的“权限声明”,例如 u+x,其中“u”表示“用户”(who),“+”表示添加(what),“x”表示执行权限 (where)。

  • 代码运行结果

总结

chmod 命令修改文件的权限。 可以使用符号或数字模式来设置权限。更多了解,请参考官方文档。

欢迎关注微信公众号【程序猿编码】,需要chmod命令完整源码的添加本人微信号(c17865354792)

Linux下chmod命令详解及C/C++代码实现相关推荐

  1. Linux下dirname命令详解及C/C++代码实现

    dirname命令的基本用法非常简单--只需写下命令名,后跟文件的绝对名称即可. 在输出中,将获得完整的目录树,但文件名除外. linux dirname 命令 以下是 dirname 命令的通用语法 ...

  2. Linux下rm命令详解及C/C++代码实现

    rm 命令是 Unix/Linux 操作系统中的基本命令之一.rm(即删除)命令用于删除 Linux 和其他类 Unix 操作系统上的文件和目录.此命令通常以静默方式运行,运行 rm 命令时应非常小心 ...

  3. Linux下uniq命令详解及C/C++代码实现

    Linux uniq 命令用于从文件中删除所有重复的行. 此外,它还可用于显示任何单词的计数.仅重复行.忽略字符以及比较特定字段. 它是 Linux 系统中最常用的命令之一. uniq 命令使用 Un ...

  4. Linux下zcat命令详解及C/C++代码实现

    如果一个压缩文件非常大,而您只想查看文件的内容是什么. 由于在这种情况下,文件的解压将花费大量时间,因此为了节省时间并在不解压文件的情况下查看文件,可以使用zcat命令. zcat 命令 通常 zca ...

  5. Linux下touch命令详解及C/C++代码实现

    touch 命令是创建新的空文件的最简单方法.它还用于更改现有文件和目录的时间戳(即最近访问和修改的日期和时间),是 UNIX/Linux 操作系统中使用的标准命令. touch 命令 touch的语 ...

  6. Linux下date命令详解及C/C++代码实现

    Linux date 命令用于显示系统日期和时间. date 命令可以用于设置系统的日期和时间. 默认情况下,date 命令显示配置 unix/linux 操作系统的时区中的日期.如果你是超级用户 ( ...

  7. linux下dd命令详解

    linux下dd命令详解    名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file 使用方式: dd [option] 如果 ...

  8. linux下scp命令详解

    http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792179.html linux下scp命令详解 http://www.9usb.net/20 ...

  9. linux下tree命令详解

    From:http://blog.163.com/ly_89/blog/static/186902299201161302812880/ linux下tree命令详解---linux以树状图逐级列出目 ...

最新文章

  1. C# 算法系列一基本数据结构
  2. thinkphp框架细节
  3. [转]手游研发数据专业术语科普 游戏热度跟啥有关
  4. 制表符补全位数在idea和eclipse中的区别
  5. php识别中文编码并自动转换为UTF-8
  6. Kali Linux 网络扫描秘籍 第七章 Web 应用扫描(三)
  7. excel设置单元格整数后还是有小数点_一招教你统一解决excel单元格的单位问题!...
  8. Linux 创建静态库(.a)和动态库(.so)
  9. js 获取url参数_小总结 - JS获取页面URL信息
  10. 迅捷PDF转换器特点和使用步骤
  11. 整理了100个必备的 Python 函数,值得收藏
  12. jsp文件上传图片到服务器
  13. 企业资源规划 ERP
  14. 【目标检测】SSD算法
  15. 机器视觉:远心镜头使用规则
  16. 数据结构 09-链表概念及常见链表结构
  17. 《第一堂棒球课》:王牌左外野·棒球7号位
  18. [原创] IE中的图片显示不出来
  19. 在 Google Play 上保护您的游戏与用户
  20. 超爆笑:《无极》漫画版

热门文章

  1. 知识点备忘-oracle的wm_concat()函数
  2. Windows驱动开发入门 --WDM inf文件模板
  3. 2013-2020年全国31省数字经济信息化基础数据
  4. Nginx监控模块vts
  5. 【区间动规】【记忆化搜索】能量项链
  6. 如何产生一个高频振荡电路?
  7. uniapp**字符串转Json并提取字段值
  8. jsp管理系统页面模板_页面静态化如何实现
  9. matlab里滑动变阻器,利用MATLAB作图分析滑动变阻器大小的选择
  10. vue使用设置背景图片的方式实现淡入淡出轮播图2