我曾经用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执行权限,因此是可以执行的。

shell_umask用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果

    原文:Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果  [函数名称] RGB分量调整         RGBAdjustProcess(WriteableBitmap  ...

  2. 中资收购美新半导体,为何能通过CFIUS审查(其实是国内公司,技术水平国内领先,和国际仍有差距)

    日前,华灿光电发布公告称,旗下子公司和谐光电收购美国美新半导体终获得CFIUS审查通过.这是中资收购豪威科技.图芯科技等公司之后,再次从美国成功收购半导体企业.而且本次中资收购美新半导体还是在特朗普上 ...

  3. clipboard.js在剪切中的使用

    目前只是对文字的复制. 下面的代码解释: 1.html 需要添加data-clipboard="copy"和data-clipboard-target="对象选择器&qu ...

  4. 比快更快——微软LightGBM

    LightGBM介绍 xgboost是一种优秀的boosting框架,但是在使用过程中,其训练耗时过长,内存占用比较大.微软在2016年推出了另外一种boosting框架--lightgbm,在不降低 ...

  5. 国家气象局 天气预报 城市代码(JSON格式)

    如题 { "城市代码": [ { "省": "北京", "市": [ { "市名": "北 ...

  6. Java MaxDirectMemorySize

    Refer to for detail: https://dzone.com/articles/default-hotspot-maximum-direct-memory-size 1. Java d ...

  7. 为什么API多用C而不是C++,为什么C++程序大多不使用异常

    读Defective C++随笔 不尽知用兵之害者,则不能尽知用兵之利也 ——<孙子兵法> 1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++ ...

  8. 【图文】[新手]C++ 动态库导出函数名“乱码”及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

  9. 响应式与bootstrap

    一.单双击问题 <body> <button>按钮</button> <script src="./jQuery.js"></ ...

  10. # 构建以及运行Springboot Docker镜像时的变量传递

    Docker可以把我们的运行环境打包,然后我们只要run就可以了.大部分hello world都是这么写的.但都缺少了实际应用环节.以springboot为例,hello world的Dockerfi ...