💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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