【Linux】文件的权限管理

Linux下文件的权限管理

文章主要从以下几个方面展开介绍:

  1. 文件的属性和权限
  2. 文件的权限和属性的更改
  3. 文件和目录的默认and隐藏权限
  4. 文件的特殊权限

: 建议在Linux下使用root权限练习本部分;


第一部分 初识文件的类型和权限

1.1 文件类型和权限的查看方式

使用Linux的同学都知道,在Linux下列出当前目录下的文件和子目录的命令是 ls, 同时 ls 又有许多参数,我们现在要查看文件的类型和权限使用ls -al;

(也可单独用 ll 或者 stat 命令查看一个文件的属性)

# ls  -l  / ;// 查看根目录下所有文件和目录

( 取部分截图)

【Linux】文件的权限管理_第1张图片

分析: 我们可以看到每个文件都有7列的选项,那么我们就来分析这七列内容分别代表的含义;

取其中一行做示范:

-r-xr-xr-x.   5     root   root  1024 Dec 24 04:00 test
[类型和属性]  [链接数] [属主] [属组][文件大小] [修改时间][文件名]
[编号] 1       2      3      4     5         6        7 

1.1.1:文件的类型和权限

-r-xr-xr-x 这个字符串我们需要分成两部分来看,第一部分是第一个字符,代表文件的类型

linux下文件的类型通常有以下几类:

d : 代表一个目录;
- : 代表一个普通文件;
l : 代表一个普通文件;
b : 代表设备文件里面的可供存储的接口设备;
c : 代表设备文件里的串行端口设备;

比较常见的就是前三种文件类型,那么此时我们知道了test 是一个普通文件;

那么-r-xr-xr-x 剩余的那部分有代表了什么意思呢?代表了文件的权限;

我们可以又将 r-x r-x r-x 分为三部分来看,三个字符一组;

前三个字符代表的是文件的属主(文件的拥有者)的权限:Owner ;
中间三个字符代表文件的属组的同组其它用户的权限: Group;
最后三个字符就代表剩余的其它用户的权限:Others;

那么权限其中字符的含义是什么呢?

r : 代表可读权限,即可以读取文件内容;
w : 代表可修改权限,即可以对文件进行增删查改;
x : 代表文件可执行权限,对于目录又有不同的含义,后面说明;
- : 代表缺省;

那么此时我们就可以了解到 test 文件的权限为,test的属主对它拥有可读可执行权限,test的属组的其它同组用户对它拥有可读可执行权限,而剩余的其它用户对test的权限也是可读可执行;

当然,文件的权限的表示形式可不止字符一种,这个我们在讲修改文件权限的时候进行讲述;


1.1.2 : 文件的链接数

第二列参数是一个数字 5 : 代表此文件的链接文件数

关于文件的链接就不再进行赘述,下面是我总结的文件的链接的博客链接:

http://blog.csdn.net/bitboss/article/details/53940236


1.1.3 : 文件的属主和属组,即编号3和编号4

我在这里将文件的属主和属组放在一块讲;

所谓属主:即文件的拥有者,是存在于Linux中的一个用户;
所谓属组:即文件的的所属组,是存在于Linux中的一个用户组;

在上面的的例子中,文件test的属主和属组都是root,那么我们在在说明代表文件权限的9个字母的时候也说了文件的属主和属组这个概念, 那么,这两个有什么作用呢?

当然就是直观的让你知道文件的属主和属组;
这里大概说明一下,具体的会在关于Linux的用户管理中讲到;

下一小节,会该诉你如何对文件的属组和属组进行修改;

1.1.5: 文件的大小,即编号5

文件的大小,单位byte,即字节,可以很清楚的告诉我们文件的内容的大小,一般情况下,用 ll 命令查看和用stat命令查看的结果是一致的,但是如果是目录的链接的话,那就不一定了!

关于文件的链接目录的链接,我有整理专门的博客:

http://blog.csdn.net/bitboss/article/details/53940236

1.1.5: 文件的修改时间,即编号6

关于Linux下文件的时间参数,我专门用了一篇博客进行学习,而这里的编号5选项的即是三个时间参数中的修改时间,也就是最重要的mtime;

作用嘛,当然是显示 的告诉用户,上次被修改的时间,下面给出关于时间参数的详细讲解博客链接:

http://blog.csdn.net/bitboss/article/details/53870273

1.1.6 : 文件的名字,即编7

这个再明显不过了,本来可以一句话带过的,但是在Linux下就不得不提一下和windows的区别之处;

即,在Linux下文件的名字的后缀是没有实际意义的,真正的作用是可以让用户显示的区别这些不同的文件,而真正对文件的起作用的还是我们前面讲过的文件的9个字符权限,其中最关键的还是 x 可执行权限,决定这个文件是否为可执行文件(注意不要和目录搞混了);

而对于可执行文件的执行方法无外乎 ./ 的方法,就像你在执行 C的可执行文件一样;


第二部分:文件的权限和属性的更改

前面针对 ll 命令的结果,对文件的信息进行了分析,其中最为重要的无外乎表示文件权限的那9个三组的字符组合;那么下面我们就这9个字符进行更深一步的学习;

2.1 权限的2种表示与对应修改方式

Linux对文件的权限的表示,一般情况下都是采用我们前面所看到的字符的表示方法,三个字符一组,分别表示文件的属主,属组和其它用户;

第二种方式即将字符对应为二进制的01,同样三个三个一组,为了方便起见,又将三个一组的01转化为8进制表示,这样就可以用3个数字表示文件的权限了;

例如:
    字符表示 :  -rwx   r-x    --x  
    二进制表示:  111   101   001
    八进制表示 :  7    5       1 

对于字符到二进制之间的转化关系很简单,即有对应位上有权限即为1 ,没有即为0; 而二进制到八进制的转换就更加简单了,即按照三个二进制向十进制的转换就可以,因为8以下的表示八进制和十进制是一样的;

接下来就是讲讲怎么去修改权限了;

在Linux下我们对文件的权限的修改命令即是: chmod;

命令格式:

chmod [选项] [模式[,模式] 文件名

2.1.1 选项: 先以字符表示为例

  1. 用户对象
    u : 表示用户,即文件属主;
    g : 表示属组,即同组的其它用户的权限;
    o : 表示其它用户;
    a : 表示所用用户;

  2. 操作符号
    +: 添加某个权限;
    -:取消某个权限;
    =:赋予给定的权限;

  3. 操作权限
    r : 可读
    w :可写
    x : 可执行

操作示范

下面是一个test文件的权限:

这里写图片描述

修改权限

: chmod  u+x,g+w,o+w  test
// 属主加可执行,同组用户加可写,其它用户加可写;
: chmod u-x,g-w,o-w test
// 去除文件的一些权限,用 '-',注意这不是算数减的意思; 

结果:

【Linux】文件的权限管理_第2张图片

下面给出 a选项的使用格式和 = 的使用格式,不做截图:

: chmod  a+x test //所有用户加可执行权限;
: chmod  u=rwx,g=--x,o=-w- test;

2.1.2 八进制权限的修改

上面演示了用chmod如何修改字符表示的权限,下面我们看看八进制表示的权限怎么修改:

很简单,我们是怎么从字符权限转换为八进制的权限的方法如果你会了,就是分分钟掌握的事情,举个最简单的例子;

比如: 我想要test 变为 -rwx rwx rwx 权限的文件,用八进制修改怎么搞?

: chmod 777 test //就是怎么简单

【Linux】文件的权限管理_第3张图片

看,就是这么简单,至于你还是不会的话,建议鼠标上滑!!!


2.1.3 文件属性的修改

这里我们对文件属性的修改更直接点说就是对文件的属主和属组的修改;

什么? 这都可以改?

当然,在Linux下你就要把自己当成是主任,不会再是windows下被限制自由的你,Linux就是人民当家做主的自由平台,只要你愿意,随便你怎么搞;

扯远了,,,,,,,,,,,,,,,,

至于修改文件的属组和属主,我们需要学习两条命令:

chgrp 和 chown

chgrp 用来修改文件的 属主,用法很简单:

: chgrp [你所想改的属组名称] [文件名]

演示:

我们先来回看一下test这个文件的属组:

【Linux】文件的权限管理_第4张图片

恩,这个test文件的属组和属主都是 root 现在我想把test文件的属组改为 america 试试看:

: chgrp america test

这里写图片描述

分析: 恩? 报错了。,怎么回事?

奥,想起来了,我就没有这个 america 这么一个用户组,所以这说明,不能把文件的 属组改为不存在的属组,属主同理;

下面我们把test的属组改为一个存在的属组 bossliu,恩,很霸气;

: chgrp bossliu test

【Linux】文件的权限管理_第5张图片

成功改变;

chown 如果只改变文件的属主的话用法和chgrp是一样的,这里不做演示;

chown 更强的的一点是它可以顺手把属组也改变掉,这样当你希望即改变文件的属主又改变文件的属组的话,就可以执行一条命令了;

例如:

: chown  属主: 属组   文件名

: chown   bossliu : root test
//我们将test的属组又变回来同时将属主变为bossliu;

【Linux】文件的权限管理_第6张图片

更改成功;


第三部分: 文件和目录的默认and隐藏权限

通过第一部分和第二部分的介绍,我们对文件的权限和属性的概念以及修改方式都有了一定的了解,下面我们说一说更高级的;

3.1 文件和目录的隐藏权限
经常鼓捣Linux的话,我们就会发现,有很多文件就算我们是root权限都不能进行修改或者删除,比如说系统的日志文件,记录用户信息的文件啊,毕竟我也接触的不多,但大概也是了解;

那么这些让root 权限都不能进行变动的文件是怎么一回事呢?

这就又提到两个命令:

chattr 和 lsattr

这两个命令当然先去 man 一下了;

chattr 是用来设置一些文件的隐藏权限,就比如不能进行修改等,

参数:

参数有很多,如果你man了的话,但是这里我只说 i和a 选项,不是我不想说其他选项,是我也不懂 —_—!!

a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。

i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。

使用方式和前面几个修改权限的命令是一样的;

比如: 我现在设置test2文件 +i和+a权限;(个人觉得这两个权限很有用,所以拿出来说说)

: chattr +a test2  //加隐藏权限

: echo "hello looker">>test2 //加入内容
: rm test2  //删除文件 

【Linux】文件的权限管理_第7张图片

分析: 我给test2文件加入隐藏权限 a 之后,可以向test2加入内容,但是没有删除的权限;

-i 选项不做演示;

上面我们说了设置隐藏权限的命令,可是没有告诉怎么查看文件的隐藏权限, 用 ls -l 肯定是看不到的,所以查看文件的隐藏权限有对应的命令:

lsattr : 查看文件的隐藏权限;

我们可以看看我们前面设置的test2的隐藏权限:

: lsattr test2

这里写图片描述

3.2 文件和目录的默认权限

我们平常在创建一个文件的时候用到的命令一般是 touch,vi, vim, gedit命令,创建目录的命令是 mkdir ,不知道在看了第二部分内容之后,你是否对创建这些文件和目录的初始权限产生了解的兴趣;

下面我们先用,四个创建文件的命令来创建文件看看默认的权限

: vi  test1   //退出并保存
: vim test2   //退出并保存
: touch test3
: gedit test4

: ll   //查看文件的默认权限

【Linux】文件的权限管理_第8张图片

分析: 恩,四种方式创建的文件都是一样的权限, 644;

下面再创建个目录 ld 看看:

【Linux】文件的权限管理_第9张图片

分析: 首先开头字母是 d的代表的就是目录,我们看空目录ld的默认权限是: 755 ;

整理一下: 看来虽说Linux下一切皆文件,但是目录和普通文件还是有一定的区别的,就比如说这个默认的权限就不一样,但是这个其实是有原因的 ,放在最后一部分说;这里就说一下这个,默认的权限是怎么设置的?

umask : 文件默认权限掩码 ;(mask是面具的意思)学过网络的话就会第一反应是: 掩码;

首先,我们先来看看系统默认的umask是多少吧,然后再来讨论;

: umask   //查看系统默认权限掩码

这里写图片描述

: 0022; 什么东东? (普通用户是 0002)

第二部分的时候我们说过,权限的表示有两种方式,字符和八进制,而二进制我认为这是过度用的; 这里的0022肯定不是字符和二进制表示了,但是如果是八进制的话是不是多了一位数啊?

这就又牵扯到了下一部分要说的文件的特殊权限,所以现在先忽略第一位,只看后三位 022 ;(真是一环套一一换)

那么,这个022又和我们的默认权限有什么关系呢?

来,先把022 变为三组二进制: 000 010 010;然后要知道一个东西是 666 和 777,分别是系统默认生成文件和目录还未经过掩码处理的权限;

而我们新建好的文件和目录则是经过掩码处理过的,究竟是怎么处理的?

还记得前面我们创建的文件和目录查看默认权限吗?
文件是 644,目录是 755; (普通用户创建新文件权限是 664,目录 775)

掩码的作用改凸显出来了,掩码中二进制表示中 1 表示去掉这个权限;
即 000 010 010 去掉属组和其它用户的写权限;

即 644 = 666 - 022 (注意这里的 - 不是算数减,而是去掉的意思)
同理: 755 = 777 - 022;

那么,如果我们想要按照自己希望的文件权限来生成可以吗?

当然可以,umask是可以被修改的,比如:我希望默认生成的所有文件权限都是 666 ,我可以将umask改为 0000;

: umask 0000  //修改系统默认掩码
: umask       //查看系统默认掩码

【Linux】文件的权限管理_第10张图片

分析: 成功修改文件默认生成权限,你也可以试试目录的;


第四部分: 文件的特殊权限

在第三部分的讲到文件默认权限掩码的时候,我们留下一个特殊权限的位没有讲,这也是第二部分和第一部分遗留的问题,那么现在我么把这个特殊的权限单独拿出来说说;

文件的特殊权限是: SUID-s(用户位置),SGID-s(组位置),和Sticky-t(粘着位置);

SUID 和 SGID 不讲,暂时没有很清楚,有待以后的学习进行补充,适当的了解了一下,很强大!类似于sudo的作用;

前面我们讲到文件的可执行权限 x时提到目录的 x和一般文件的不一样,具体哪里不一样呢?

对于目录来说,执行位的作用是控制能否进入或者通过该目录,而不是控制能否列出它的内容。读取位和执行位的组合的作用才是控制是否列出目录中的内容。写入位和执行位的组合则是允许在目录中创建,删除,和重命名文件。(不过在我的Linux中的root权限下不起作用

举个最简单的例子,现在我的目录 ld 的当前用户的执行位没有权限,那么我是否可以列出它里面的内容呢?

注意: 我现在在普通用户 bossliu 下;在code目录下有个ld目录,里面放有两个空文件test1,test2;

【Linux】文件的权限管理_第11张图片

一切就绪,我们先来试试,先来试试只给这个目录属主的可执行权限:

: chmod 111 ld

【Linux】文件的权限管理_第12张图片

分析: 恩,正如所述,只有x权限只能进入目录,其它什么都干不了;

在给个 r 权限看看:

: chmod u+r ld

【Linux】文件的权限管理_第13张图片

分析: 恩,正如所料,只能看不能动;

至于想要动一动ld目录下的东西,那就加 w 权限,这个不做演示,但是注意,没有x权限的话,都是纸上谈兵;

讲了半天目录的权限,一是把前面部分遗留的问题解决,那么二就是和我们的粘着位又是些关系了;

Sticky 粘着位: 目录设置了t(粘着位)之后,只有目录的所有者以及root才可以删除该目录,有点像低级版的隐藏权限;

那么,粘着位要怎么设置呢?

其实和其它权限的设置是一样的,不过粘着位占得是x权限的位置,SUID和SGID 分别也占对应的x的位置;

都是用chmod命令;至于说区别嘛,倒是有那么一些;

首先字符设置时和其它权限的设置是一样的,就是表现出来有些差异:

: chmod u+s,g+s,o+t ld

结果: drwsr-sr-t

需要注意的是,这三个权限对应的位置是固定的,并不是每一个位置有三个表示;

采用八进制的方法:

可以将这三个位又组成一个三位二进制: sst–111

SUID存在的话用二进制 : 100 表示,即八进制 4
SGID存在的话用二进制:010表示,即八进制 2
Sticky存在的话用二进制: 001 表示,即八进制 1

这样也就有了我们第三部分的umask为甚是四位八进制表示了,第一位就代表的是特殊权限;

到这里你就要问,那原来的执行权限怎么办?

这就是个很巧妙的设计了,当你开启特殊权限并且有可执行权限的话,这三个特殊权限都是小写,如果,没有可执行权限,只有特殊权限的话就是大写表示

例如:

: 假如 ld 目录的权限是: drwxr--r-x 

现在加入sst;
: chmod 7745 ld   //注意,练习用4位八进制表示
结果 :  drwsr-Sr-t ;

【Linux】文件的权限管理_第14张图片

这样应该懂了特殊权限的表示方法了吧,也大概对粘滞位有了了解;

完!

你可能感兴趣的:(Linux,随笔存档)