Linux系统必须掌握命令之umask命令
可以使用命令umask来查看umask值
app@app-pc:~$ umask
0002
可以看到umask值为0002,其中第一个0与特殊权限有关,可以暂时不用理会,后三位002则与普通权限(rwx)有关,其中002中第一个0与用户(user)权限有关,表示从用户权限减0,也就是权限不变,所以文件的创建者的权限是默认权限(rw),第二个0与组权限(group)有关,表示从组的权限减0,所以群组的权限也保持默认权限(rw),最后一位2则与系统中其他用户(others)的权限有关,由于w=2,所以需要从其他用户默认权限(rw)减去2,也就是去掉写(w)权限,则其他人的权限为rw-w=r,则创建文件的最终默认权限为 -rw-rw-r--。同理,目录的默认权限为 drwxrwxrwx,则drwxrwxrwx-002=(drwxrwxrwx)-(--------w-)=drwxrwxr-x,所以用户创建目录的默认访问权限为 drwxrwxr-x。我们通过下面的例子验证一下:
app@app-pc:~$ umask
0002
app@app-pc:~$ touch test.txt
app@app-pc:~$ ls -l test.txt
-rw-rw-r-- 1 app app 0 8月 24 20:31 test.txt
app@app-pc:~$ mkdir test
app@app-pc:~$ ls -al test
total 8
drwxrwxr-x 2 app app 4096 8月 24 20:32 .
可以看到文件test.txt的权限为 -rw-rw-r--,目录test的权限为 drwxrwxr-x (.代表当前目录,也就是test目录的属性)。
umask命令显示的为umask的数字值,还可以使用命令 umask -S 来显示umask的符号值:
app@app-pc:~$ umask -S
u=rwx,g=rwx,o=rx
可以看出(rwxrwxrwx)-(rwxrwxr-x)=(-------w-)=002。
2.更改umask值可以通过命令 umask值的方式来更改umask值,比如我要把umask值改为027,则使用命令umask 027即可。改成027后,用户权限不变,群组权限减掉2,也就是去掉写(w)权限,其他用户减7,也就是去掉读写执行权限(rwx),所以其他用户没有访问权限。
app@app-pc:~$ umask 027
app@app-pc:~$ umask
0027
app@app-pc:~$ touch test.txt
app@app-pc:~$ ls -l test.txt
-rw-r----- 1 app app 0 8月 24 20:31 test.txt
app@app-pc:~$ mkdir test
app@app-pc:~$ ls -al test
drwxr-x--- 2 app app 4096 8月 24 20:32 .
可以看到文件test.txt的默认访问权限变为了-rw-r-----,目录test的默认访问权限变为了drwxr-x---。这种方式并不能永久改变umask值,只是改变了当前会话的umask值,打开一个新的terminal输入umask命令,可以看到umask值仍是默认的002。要想永久改变umask值,则可以修改文件.profile或.bashrc,在文件中添加一行umask027。
3.总结当我们想改变创建文件和目录时的默认访问权限,则可以通过umask命令来实现。
PS最近在Linux系统中通过tomcat部署项目后,由于程序有上传文件功能。而上传后的文件的权限和umask设置的默认权限不一致,也就是说创建的文件应该是644的权限,而上传的文件却是640的权限。后来通过对查询Tomcat发现从tomcat8开始,catalina.sh文件中有下面几行代码
if [ -z "$UMASK" ]; then
UMASK="0027"
fi
umask $UMASK
也就是说tomcat8将umask的值进行了修改,修改为了0027,也就造成了上传文件权限的问题(这个问题从tomcat8才有,tomcat8以下版本是没有这个问题)。因此将代码中的UMASK修改为所需即可