[TOC]
当我们使用linux用户创建一个文件或目录时,这个文件或目录会有一个默认的权限(比如777),我们可以通过umask来调整默认值。
### **查看umask**
执行命令umask就可以查看当前用户的umask值,显示是四位数字。
```
$ umask
0022
```
上面有四位,第一位一直是0,可以忽略,也就是上面的umask的`0022`相当于`022`。一个用户创建的文件和目录的默认权限为
* 文件:`666 - umask`
* 目录:`777 - umask`
比如上面的umask的值为`022`,那么创建的文件的默认权限为`644(rw-r--r--)`,而创建的目录的默认权限为`755(rwxr-x-r-x)`。
### **永久设置umask的位置**
我们可以在shell中通过命令`umask xxx`来临时设置umask,但终端关闭后,就不再生效。所以我们需要永久地设置umask。通常有以下文件可以设置,这些文件中,其实也是调用umask命令进行设置。
设置umask的位置一般有以下几处:
* /etc/profile及/etc/profile.d/
* /etc/bashrc
* ~/.bash_profile
* ~/.bashrc
我们给出它们设置umask与调用其他文件的关系:
```
/etc/profile
├──> umask
├──> /etc/profile.d/*.sh
└──> /etc/profile.d/sh.local
/etc/bashrc
├──> umask
└──> /etc/profile.d/*.sh
~/.bash_profile
└──> ~/.bashrc
~/.bashrc
└──> /etc/bashrc
```
上面给出了结论,下面我们可以来看一下这些文件的代码,来详细的分析一下。
* /etc/profile
在`/etc/profile`文件中,有如下代码:首先该代码设置了用户的umask,然后再执行`/etc/profile.d/`目录下的.sh文件与sh.local文件,如果`/etc/profile.d/*.sh`文件中有设置umask的代码,那么它们的执行顺序在`/etc/profile`之后。
```
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
```
* /etc/bashrc
在`/etc/bashrc`中,代码如下,它设置完umask会调用`/etc/profile.d/*.sh`
```
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
SHELL=/bin/bash
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
```
* ~/.bash_profile
该文件默认的内容如下,它本身没有设置umask,但是它会调用`~/.bashrc`
```
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
```
* ~/.bashrc
该文件的默认内容如下,它没有设置umask,它调用了`/etc/bashrc`
```
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
```
**一般来说,我们最好保持默认的设置,不要在`~/.bashrc`与`~/.bash_profile`文件中添加命令`umask xxx`来设置。**
### **用户的umask设置多少合适**
在`/etc/profile`文件中,有如下代码,意思是:uid大于等于199且user name等于group name时,umask为002,否则umask为022。
```
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
```
一般我们手动创建的用户其uid是大于199的,且我们使用命令`useradd xxx`创建一个用户时,会自动创建同名的用户组。这种情况下,用户的umask为002。而root用户的uid为0小于199,所以root用户的uid默认为022。
我们来看一下022与002的效果
* 022:创建的文件就是644(rw-r--r--),而创建的目录的权限为755(rwxr-x-r-x);只有用户自己才能写自己的文件,用户组内的其他用户和普通用户一样,只能读该用户的文件,不能写该用户的文件。
* 002:创建的文件就是664(rw-r--r--),而创建的目录的权限为775(rwxr-x-r-x);用户组内的所有用户都有读写该用户文件的权限。
通过上面的分析可以看出,root用户设置为022,即能保证其他用户可以读root用户的系统文件,进入root用户创建的系统目录,又能保证其他用户无法写这些文件,增加了系统的安全性。
**一般来说,我们最好保持默认配置,root用户的为022,普通用户的为002。**
### **参考**
* https://www.computernetworkingnotes.com/rhce-study-guide/how-to-change-default-umask-permission-in-linux.html
- 常用命令
- 用户与用户组
- 创建用户与用户组
- 快速脚本
- umask
- Yum源
- 基础Yum源
- Epel源
- 制作Yum源
- 同步Yum源
- 为Yum源配置代理
- 下载RPM及依赖
- 系统与内核
- 获取内核的rpm包
- 升级内核
- Iptables
- 基本语法
- 匹配条件
- 基础匹配条件
- 扩展匹配条件
- Addrtype
- Set
- TCP
- Mark
- Multiport
- 目标
- 基本目标
- 扩展目标
- DNAT
- LOG
- CT
- NOTRACK
- MARK
- IP set
- 连接追踪
- 初识连接追踪
- 连接追踪详解
- NAT
- 思路与参考汇总
- 数据结构
- FAQ
- Keepalived
- 单网卡多VIP
- 安装Keepalived
- 双网卡绑VIP
- 别名VIP和辅助VIP
- LVS
- 安装LVS
- Ipvsadm命令
- 磁盘与分区
- 基础知识
- 创建分区
- 格式化与挂载
- Fstab
- LVM
- LVM扩容
- Swap分区
- Tmpfs
- 网络相关
- 重命名网卡
- resolv.conf
- Tcpdump
- nslookup与dig
- ifcg-xxx
- 主机名
- 软件安装
- NFS
- Squid
- Redsocks
- Shadowsocks
- 时钟同步
- Chrony
- FTP
- 文件句柄
- 简介
- 设置文件句柄
- 其他
- SSH密钥登录
- 进程组-会话-终端
- X11转发
- 环境变量
- 常见问题
- 系统进程数
- 系统调用
- 系统调用FAQ
- 用户程序如何进行系统调用