我曾经用touch命令创建一个文件script,默认的权限是”rw-r- -r- -”,有的朋友就有可能问为什么是这种组合?其实,这正是umask命令捣的鬼。在linux上输入:umask,如图一所示:



图一.umask输出结果

可以看到输出结果时0022。那么这个和script刚创建时的权限有什么关系呢?下面来做一个简单的运算,就可以看出来了。一个文件可以被sxp用户、users组用户、其他不相干用户(第一篇中有介绍)读、写和执行的权限就是777(以八进制表示),以字符表示就是rwxrwxrwx(请参见第一篇)。而umask值是0022,第一个0不看,那就是022,它也是3列数字,第一列代表sxp对刚创建的文件所具有的权限;第二列数字代表users组用户对刚创建的文件所具有的权限;第三列数字代表其他不相干的用户对刚创建的文件所具有的权限。

再来分析,我在第一篇说过,r代表读权限,对应的数字是4,w代表写权限,对应的数字是2,x代表执行权限,对应的数字是1,那么umask值022(八进制写法)转换为字符表示的权限就可以写成

- - - -w- -w-(1)

为什么可以写成这样,在我的第一篇中都已讲过。那么权限777(八进制写法)转换为字符表示的权限就是rwxrwxrwx(2)

比较(1)与(2)对应的列,比如第一列和第一列比较等,从(2)中拿走(1)中对应的列的字母,比如(1)中头三列都是空,(2)中头三列不碰它,还是rwx;(1)中第二个三列有一个w,其他都是空,那么从(2)中就拿走w,此时(2)就变成rwxr-xrwx;(1)中最后一个三列有一个w,那么在(2)中同样拿走w,(2)变成rwxr-xr-x;这就是刚创建目录时,该目录所具有的权限。比如,我新创建一个目录wx,使用命令

mkdir wx

mkdir(后续文档会讲到此命令),结果如图二所示;



图二.新创建目录的权限

可以看到,新创建的目录wx的权限确实是rwxr-xr-x。

对于刚创建的文件的权限,从(2)中再拿走x位即可,就是从rwxr-xr-x中拿走x位,(2)变成rw-r- -r- -。为了验证,我删除原先的script命令,再重新创建它,命令是:touch script,如图三所示:



图三.新创建文件的权限

我说的没错吧,script权限确实是rw-r- -r--。

其实我上面所讲的如何根据022来计算出一个新创建的目录的权限或者是文件的权限的方法是一个普遍的方法。如果umask值不是0022,是0033,该如何计算呢?步骤是一样的,不看第一个0,就看剩下的033,这是一个八进制,3=2+1,因此033换算成以字符形式表示的权限位就是- - - -wx-wx,然后按照上面的步骤算一下就可以了。

umask在工作中较少用到,为什么要开这一篇,是应为我曾经遇到一个很奇怪的问题,就是和umask有关。我在script中写入内容如下:

#!/bin/sh

…..file(此处省去**字,哈哈,其实就是往file中写入一些数据库查询的sql语句,该动作也自动地创建了该文件)

chmod 555 file (给sxp用户、users组用户、其他用户赋予写和执行权限,因此这三种用户可以写和执行file文件)

su – wx –c file(意思是从sxp用户切换到wx用户,准备执行file文件)

我设置一个定时任务crontab,用以在指定的时间执行script脚本(此时script脚本我已经赋予执行权限),可是其中的file文件没有被执行。

如果我手动执行script,其中的file文件时可以被执行的。这个问题是不是很奇怪?其实都是umask在捣鬼。因为用定时任务执行script时,umask值是002,而我手动执行时,umask值是022.朋友可以算下,在script脚本中创建file文件时的权限,再加上chmod 555 file,最后,通过定时任务执行script脚本时,它的权限是-wx-wx-wx,在切换到wx用户后,由于wx是属于其他不相干的用户,因此wx用户的权限是-wx,可以看到wx没有r,也就是读权限。没有读权限,就算有x权限,wx用户也不可能执行file脚本的。

而手动执行script时,由于umask值是022,最终file权限是r-xr-xr-x,wx用户具备r,也就是读权限,且有x执行权限,因此是可以执行的。
posted on 2017-01-06 13:46  C语言答疑课堂  阅读(331)  评论(0编辑  收藏  举报