美文网首页androidLINUX学生会
linux文件系统权限管理

linux文件系统权限管理

作者: fengkaipeng | 来源:发表于2017-05-28 15:58 被阅读127次

    一.文件权限

    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命令写入即可

    相关文章

      网友评论

      本文标题:linux文件系统权限管理

      本文链接:https://www.haomeiwen.com/subject/utdhfxtx.html