linux文件系统权限管理

一.文件权限

linux中,文件系统有自带有权限管理,针对资源(文件,目录,程序)去管理,我们先来看下针对文件的权限管理,通过ll查看一个文件,如下:

[root app]#ll a.txt 
-rw-r--r-- 1 root root 0 5月  27 11:10 a.txt

其中rw-r--r--.就是这个文件的权限了,而后边的root root代表文件的属主和数组,我们先列一下。
权限:

  • r:read,读权限,可用4表示
  • w:write,写权限,可用2表示
  • x:execute,执行权限,可用1表示

文件所属:

  • u:属主,文件所有者,就是上边的第一个root
  • g:属组,文件所属者的主组,就是上边第二个root
  • o:其他,表示既不是文件属主也不是文件属组的其他用户,上边没有显示出来;

其实权限rw-r--r--是分为三段的,三个为一段。rw-为第一段,表示用户的属主的权限,r是读,w是写,-为空,所以这个文件的所有者权限就是读和写;第二段r--表示用户的属组的权限,只有r,后边为空,所以权限为只读;第三段为其他用户,权限也是只读。比如,feng用户是一个其他用户,我们切到这个用户,往文件里边写东西,会提示权限不够,如下:

[root app]#su feng
[feng app]$echo "haha" >> a.txt 
bash: a.txt: 权限不够

明白这些之后,我们就可以给文件更改权限了,命令为chmod,比如要让feng用户拥有给a.txt写的权限,就这样写:

[root ~]#chmod u=rw,g=r,o=rw a.txt

然后ll a.txt看一下结果:

[root ~]#ll a.txt 
-rw-r--rw-. 1 root root 12 5月  21 16:20 a.txt

验证下:

[root app]#su feng
[feng app]$echo "haha" >> a.txt
[feng app]$cat a.txt 
haha

没有提示错误,a.txt之前是空的,现在有内容了。当然只要给他加执行权限,可以用简单的写法:

[root app]#chmod o+w a.txt

或者直接用数字来表示,上面也提到过,r表示4,w表示2,x表示1,读写就是4+2为6,以此类推:

[root app]#chmod 646 a.txt 
[root app]#ll a.txt 
-rw-r--rw- 1 root root 5 5月  27 11:24 a.txt

另外我们也可以修改文件的属主和属组,命令为chown和chgrp:

[root app]#ll b.txt 
-rw-rw-r-- 1 feng feng 0 5月  27 13:04 b.txt
[root app]#chown root b.txt 
[root app]#ll b.txt 
-rw-rw-r-- 1 root feng 0 5月  27 13:04 b.txt
[root app]#chgrp root b.txt 
[root app]#ll b.txt 
-rw-rw-r-- 1 root root 0 5月  27 13:04 b.txt

二.目录权限

通过上面的讲解,我们了解了文件的权限,现在来看点不一样的地方:将a.txt换成其他用户只读,然后用feng用户删除a.txt,因为feng用户没有w权限,所以删除不了。然而,结果并不是这样:

[root app]#chmod o-w a.txt 
[root app]#ll a.txt 
-rw-r--r-- 1 root root 5 5月  27 11:24 a.txt
[root app]#su feng
[feng app]$rm -f a.txt 
[feng app]$ll a.txt
ls: 无法访问a.txt: 没有那个文件或目录

没有w权限的feng用户竟然删除了a.txt,这其实是另一层原因导致的。

文件名字其实是存于目录文件中的,而删除文件其实只是删除目录中的文件名和i节点编号,不会删除节点表和数据,所以删除文件只需要用户对目录有w权限就可以的。下面为目录权限的作用:

  • r: 可以使用ls查看此目录中文件列表
  • w: 可在此目录中创建文件,也可删除此目录中的文件
  • x: 可以使用ls -l查看此目录中文件列表,可以cd进入此

目录权限的设置更改和文件一样。要将目录下所有文件的权限包括目录都设成相同权限,可以用chmod -R来实现递归操作。但是目录一般都是需要x权限的,要不查看和进入操作都不能实现会很难受,而文件一般不会给x权限,递归操作就有点不方便了,这时,就需要X权限,他的作用是在递归授权的时候,只给目录加上x权限,而文件不加,如下:

[root app]#chmod -R a=rwX /app
[root app]#ll -a /app
总用量 8
drwxrwxrwx.  2 root root 4096 5月  27 13:09 .
dr-xr-xr-x. 30 root root 4096 5月  27 10:03 ..
-rw-rw-rw-   1 root root    0 5月  27 13:09 1.txt
-rw-rw-rw-   1 root root    0 5月  27 13:09 2.txt
-rw-rw-rw-   1 root root    0 5月  27 13:09 3.txt

三.特殊权限SUID,SGID,Sticky

SUID

当一个用户想要运行一个程序时,需要拥有这个程序文件的执行权才可以执行,有些程序普通用户是没有执行权限的,比如说创建用户的useradd:

[root app]#ll /usr/sbin/useradd 
-rwxr-x---. 1 root root 111320 5月  11 2016 /usr/sbin/useradd
[root app]#su feng
[feng app]$useradd haha
bash: /usr/sbin/useradd: 权限不够

而当一个用户执行了一个程序的时候,这个生成的进程的属主就变成了这个用户,和程序文件本身属于谁没关系,比如我们用feng用户执行cat,用ps查看进程,看到进程的属主是feng:

[root ~]#ps aux|grep cat
feng       3513  0.0  0.0 100952   556 pts/0    S+   14:10   0:00 cat

所以,不同的用户发起的进程,权限是不同的。这样就带来一个问题,比如我们要给自己的账号修改密码,虽然用的是passwd这个命令,但是最终结果会写到/etc/shadow这个文件,普通用户对他是没有任何权限的,我们看一下:

[root app]#ll /etc/shadow
-r-------- 1 root root 1953 5月  26 14:15 /etc/shadow

所以就会导致普通用户修改自己账户的密码都没有这个能力,这就是很尴尬的事情了,但事实是普通用户可以修改自己的密码的,因为系统给passwd这个命令设置了特殊权限,我们来看下:

[root app]#type passwd
passwd is /usr/bin/passwd
[root app]#ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd

其中,用户属主的第一段为rws,这个s就是特殊权限SUID,他的用途就是将执行进程的用户变成程序文件属主,由于/usr/bin/passwd这个程序文件的属主为root,所以,不管哪个用户执行这个程序,进程属主都是root,这样就可以做到每个用户都可以修改自己的密码写入/etc/shadow中。如下,我们用feng用户执行passwd程序,用ps aux看下进程属主是root而不是feng:

[feng app]$passwd
更改用户 feng 的密码 。
为 feng 更改 STRESS 密码。
(当前)UNIX 密码:
[root ~]#ps aux|grep passwd
root       3661  0.0  0.1 165652  1916 pts/0    S+   14:45   0:00 passwd
root       3665  0.0  0.0 103344   856 pts/1    S+   14:45   0:00 grep passwd

SUID只能作用在二进制可执行文件上才有意义,给文件加减SUID得语法为chmod u+s FILE和或者用数字表示chmod 4755 FILE,第一个4为SUID。

SGID

SGID也可以作用在可执行二进制文件上,代表执行这个程序的用户自动变成文件属组用户,拥有文件属组的权限。语法为chmod g+schmod 2755
另外,SGID还可以作用在目录上,让目录中新建的文件继承父目录的所属组,如下:

[root app]#chmod g+s /app
[root app]#ll -d /app
drwxrwsrwx. 2 feng feng 4096 5月  27 15:07 /app
[root app]#cd /app/
[root app]#touch test
[root app]#ll test
-rw-r--r-- 1 root feng 0 5月  27 15:09 test

Sticky

我们来考虑一个问题,当几个用户同时需要在一个目录下写文件时,他们肯定都拥有目录的写权限,但是这样就可以删除别的用户在这个目录下的文件。这时就需要Sticky来限制这种行为。
Sticky作用在目录上,作用就是让文件的属主才拥有删除文件的权利,别的用户对文件只能追加,不能修改和删除改名。语法为chmod o+t或者chmod 1755

注意

当基础权限中没有x权限时,s和t权限显示都会变成大写S和T。

umask

创建文件和目录时,有个默认的权限,文件为644,目录为755.这是因为有个叫umak的东西,我们可以理解成权限的掩码,用umask查看默认掩码:

[root app]#umask
0022

而由于文件x权限比较危险,所以文件最高权限为666,目录最高权限为777,然后默认umak为022.所以文件的默认权限就是666减去022,就是644了,目录同理为755.
那么问题又来了,我们将文件最高权限设为666就是不想让文件拥有x权限,但是假如将umak设为013呢,默认创建的文件权限为653,是有执行权限的。但是事实是这样吗,我们来看下:

[root app]#umask 013
[root app]#umask
0013
[root app]#touch test2
[root app]#ll test2
-rw-rw-r-- 1 root feng 0 5月  27 15:43 test2

事实是新创建的用户并没有x权限,而是在掩码的基础上基数加1了。这其实是因为掩码的本质是用二进制异或运算的,我们也不需要太了解,只需要知道当掩码设为奇数时,文件得出的权限偶数不变,奇数加1就得出了最终结果。

用umak命令设置的掩码时保存在内存中的,系统重启就丢失,如果要自定义umask我们要写进开机启动文件中,在/etc/bashrc中或者用户家目录.bashrc等启动文件中将umask命令写入即可

    原文作者:fengkaipeng
    原文地址: https://www.jianshu.com/p/190cbc9b23f8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞