浅谈linux中umask值及其对应的文件权限

最近刚好系统学习到linux文件权限这一块,在“umask值及其对应的文件权限”这一个问题上,找过视频看(老男孩老师的视频,强烈推荐),也看过鸟哥的书,当然也在网上找了找,发现计算方法都是多种多样的,但是个人觉得掌握一种就好了,看了各种方法,觉得其实大多数都是在找规律,不是找规律的又实在是太复杂,因此个人感觉不太好记,时间一长可能就忘记了,于是就根据自己的理解,做各种测试,发现有了如下更好的方法。(从理解和记忆的层次上更好的方法)



 1.问题引出:设置umask为004与005时,创建的文件默认权限都是一样的

设置umask为004的情况:

[[email protected] right]# umask 005
[[email protected] right]# umask
0005
[[email protected] right]# touch 005file
[[email protected] right]# ls -l 005file 
-rw-rw--w- 1 root root 0 7月  29 12:19 005file

这里的分析,为了简便,我都是只关注others的权限来进行分析。

由上面的输出可以看到,others的权限为-w-,即为3,由umask的含义(表示拿掉的权限)知,拿掉5,即拿掉了r权限和x权限(由r w x分别对应数字4 2 1知),所以创建005file文件中others的权限即为-w-,也就是2了,这与我们的认知是不相违背的。

设置umask为004的情况:

[[email protected] right]# umask 004
[[email protected] right]# umask
0004
[[email protected] right]# touch 004file
[[email protected] right]# ls -l 004file
总用量 0
-rw-rw--w- 1 root root 0 7月  29 12:21 004file

根据上面的分析,按道理来说,这里拿掉了others 4即r的权限,那么新创建文件others的权限就应该为-rx,可是这里怎么会是-r-呢?难道系统出错了?

当然不是了,这里也是最关键的问题所在,对此,有如下结论:

  • 对于文件来说,如果umask没有去掉x权限,则系统自动处理掉x权限;
  • 对于文件来说,如果umask有去掉x权限,则系统按正常情况去掉相应权限;
  • 对于目录来说,则不存在这样的情况。

什么意思呢?

拿上面的两个例子来说:

(1)对于设置umask为004的情况,即表示要拿掉(others)r的权限,所以默认权限就应该为-wx才对,可是由于umask没有去掉x权限,所以在我们创建新文件时,系统自动帮我们把x权限拿掉了,因此,创建的文件的权限才为-w-。

(2)对于设置umask为005的情况,即表示要拿掉(others)r和x的权限,此时,umask有去掉x权限,所以我们就按正常情况来处理好了,即创建的文件的权限就为-r-

(3)所以由上面的分析可以知道,设置umask为004和005时,文件的默认权限都是一样的。

2.深入分析:为什么系统会自动帮我们拿掉x权限?

想一下,我们平时用touch来创建文件,绝大多数都是用来干嘛的?当然是用来存储和记录数据的,因此,这样的文件应该是不能够执行的(即使有x的权限),所以既然如此,在我们创建文件时,就应该没有必要把x权限也加上去了,如果实在需要的话,就自己手动给一个文件加x权限好了。

于是出于这样的原因,系统就帮我们自动把x权限给拿掉了。

3.建议:用理解的方法去吸收“umask值及其对应的文件权限”知识

以上的内容(第2点)并非有什么科学依据,只是我自己个人根据实际中测试的结果所做的一个猜测,当然鸟哥的书当中似乎也有在透露这一点(只是感觉不够清晰和明确)。

我自己作为一个linux的新手,目前正在努力看老师的视频,同时也在看鸟哥的书,个人觉得这样去记忆是比较好的,比如umask是006,由于6表示把r和w权限拿掉,但是没有把x权限拿掉,所以在我们创建文件的时候,系统就把这个x权限也拿掉了,最终ohters的权限也就为---了;再比如umask为3,由于3表示把w和x权限拿掉,有包括x权限,以在我们创建文件的时候,最终ohters的权限也就为r--了。

我想对于大多数人来讲,这样的方法算出答案应该还是比较快的吧,至少我觉得我不算聪明,但是也可以比较快的口算出来,当然前提是你要知道:1.umask是什么意思  2.r w x对应的数字分别为4 2 1(其实就是二进制的一、二、三位,分别是2的0次、1次、2次方),相比记忆奇数或偶数,我想这样的方法对于新手来讲应该是更能去理解和记忆的。

当然,上面只是个人的一点看法而已,不过作为新手来讲,真心是建议用这样的方法去理解和记忆。

时间: 2024-12-08 14:29:19

浅谈linux中umask值及其对应的文件权限的相关文章

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

浅谈linux中shell变量$#,[email&#160;protected],$0,$1,$2,$?的含义解释

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,[email protected],$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux

浅谈C#中的值类型和引用类型

在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的

【.Net】浅谈C#中的值类型和引用类型

在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的

辛星浅谈Linux中的环境变量

全局变量和本地环境变量: bash  shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息,这也是环境变量的名字的由来.该特性还允许我们把数据存储在内存中,以便于在shell中运行的程序或者脚本中访问它们.bash  shell中共有两种类型的环境变量:全局变量和本地变量. 全局环境变量在shell会话和该shell产生的任何子进程中都可见.而本地变量则只在创建它们的shell中可见.在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用.系统环境变量使用

浅谈linux 中的目标文件 即.o后缀名的文件

实际上 目标文件从结构上讲,已经非常接近可执行文件,只是没有经过链接的过程,所以其中有些符号或者地址还没有被调整. 实际上上在linux下 都是可以称之为ELF文件. 看一下这个图,a.out 就是我们的hello.c的执行文件.hello.o 就是目标文件 所以实际上他们2 几乎是一样的. 一般目标文件有很多属性,比如符号表啊,字符串之类的,然后目标文件 把这些属性 按照 segment的形式存储,也叫段.就是大家经常遇到的段错误 里的那个段. 一般来说程序代码被编译以后 主要分为程序指令和程

浅谈Linux中男人的魅力—man

在Linux系统中提供帮助的命令.通俗点来说它就是命令的使用手册.它共分九个章节1.用户命令2.系统调用3.C库调用4.设备文件及特殊文件5.配置文件格式6.游戏7.杂项8.管理命令及守护进程9.Linux内核API(CentOS7以后出现)比如想知道某一个命令属于man的那一章节我们可以用whatis command(命令)例: whatis pwd[[email protected] ~]# whatis pwdpwd (1) - print name of current/working

浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

本文以CaffeNet为例: 1. train_val.prototxt 首先,train_val.prototxt文件是网络配置文件.该文件是在训练的时候用的. 2.deploy.prototxt 该文件是在测试时使用的文件. 区别: 首先deploy.prototxt文件都是在train_val.prototxt文件的基础上删除了一些东西,所形成的. 由于两个文件的性质,train_val.prototxt文件里面训练的部分都会在deploy.prototxt文件中删除. 在train_va