Linux 文件权限之不完全解析!

时间:2022-11-10 21:12:12

原创作品,欢迎转载,转载时请务必以超链接形式标明文章出处 、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/sinchb/article/details/11746427

        本文着重介绍与Linux文件权限相关等问题,比如用户与用户组,文件权限,文件默认权限和文件特殊权限等。

        Linux 为什么需要那么多的权限限制呢?其实这些都是为了“安全起见”啊!如果你的Linux系统里存了你给心上人写的情书,或者是某亚洲岛国的动作大片,你总不希望谁都可以翻翻看吧?!好了,废话少收,让我们一起来看看Linux文件权限到底是什么东东!

1.文件所有者

        对于文件来说,访问该文件的账号的身份有三类:文件所有者(owner),文件所属的用户组(group),以及用户组外的其他人(others)。由于本文着重介绍文件权限,这些概念简单介绍,不做全面阐述。

1.1文件所有者(owner)

        这个就不用解释了吧?不过还是有些注意点,文件刚刚创建的时候,文件所有者是创建文件的用户,但是文件所有者是可以通过chown来改变的!这个后面会介绍到。

1.2用户组(group)

        文件所在用户组,用户组的概念请自行百度之!用户组和用户的关系好比家庭里你家人和你的关系。注意,文件所有者的账号可能不属于该用户组。

1.3其他人(others)

        除了用户组和文件所有者的之外的其他访问者统称为others,也就是你家庭以外的人!

        除了这三种账号以外,还有就是那个超级账号root,这是个无所不能的账号!你可以暂时把他当做你家所在村的村长,管着这个村的各个家庭(group),

2.Linux文件权限的概念

2.1Linux文件权限概念

        Linux系统内文件的三种身份(拥有者、群组与其他人),知道每种身份都有三种权限(rwx)、
           有上面介绍我们可以知道一个文件的访问者有三种身份:owner(user),group,others。而文件权限也有三种,即:可读,可写,可执行权限。简写为   r,w,x,分别是read,write,execute的缩写。那么排列组合一下,一个文件就会有多大9种的权限(实际上更多!后面会介绍!):owner的权限r,w,x,group的权限rwx,以及others的权限rwx。这些权限分别限制了这三种用户是否对该文件拥有可读和(或)可写和(或)可执行的权限。

2.2 查看Linux文件的权限

[plain]  view plain copy
  1. [root@Cherish linux]# touch test  -->创建一个空文件!  
  2. [root@Cherish linux]# ls -al    -->显示文件属性!  
  3. 总用量 8  
  4. drwxr-xr-x.  2 root root 4096 12月 11 22:36 .  
  5. dr-xr-x---. 37 root root 4096 12月 11 22:32 ..  
  6. -rw-r--r--.  1 root root    0 12月 11 22:36 test  

简短标注:

-rw-r--r--.                    1            root        root             0               12月 11 22:36       test

文件类型和权限     i-node连接数    所有者    所属用户组    文件大小     文件ctime或者mtime      文件名

我们可以看到文件有非常多的属性(其实还有很多!)这里着重介绍第一列,因为他们表示了该文件的文件权限!

我们将第一列表示文件类型和权限的十个字符抽出来单独分析,可以分为三组:

 -                       rw-                           r--                         r--

第一组                           第二组                                           第三组                                 第四组


第一组一个字符,表示文件的类型,[-]代表是一般文件,[d]代表是目录,[l]代表链接文件。

第二组3个字符,表示文件所有者的权限。这3个字符从左到右分别表示该身份对文件权限   是否可读? 是否可写?是否可执行? 出现rwx相应的字母就表示有相应的权限,出现   -   则表示没有相应的权限。例如,test文件所有者的权限是rw-,表示该文件所有者对文件具有可读可写权限,但是不具有可执行权限。

第三组3个字符表示所属用户组的权限,格式同上。test文件只具有可读权限。

第四组3个字符表示others的权限,格式同上。test文件只具有可读权限

3.改变文件权限和属性的方法

3.1.改变文件属性的方法

chown   [-R]    dir/file      改变文件的所有者,加上-R则连同子目录下的所有文件和目录都更新

例:将test文件的文件所有者从root,改为Cherish

[plain]  view plain copy
  1. [root@Cherish linux]# ll test   
  2. -rw-r--r--. 1 root root 0 12月 11 22:36 test  
  3. [root@Cherish linux]# chown Cherish test   
  4. [root@Cherish linux]# ll test   
  5. -rw-r--r--. 1 Cherish root 0 12月 11 22:36 test  

chgrp [-R]    dir/file  改变文件所属用户组,加上-R则连同子目录下的所有文件和目录都更新

例:将test文件的用户组从root ,改为Cherish

[plain]  view plain copy
  1. [root@Cherish linux]# ll test  
  2. -rw-r--r--. 1 Cherish root 0 12月 11 22:36 test  
  3. [root@Cherish linux]# chgrp Cherish test   
  4. [root@Cherish linux]# ll test  
  5. -rw-r--r--. 1 Cherish Cherish 0 12月 11 22:36 test  

3.2.改变文件权限(chmod)

(1)数字类型权限

使用数字来代表各个权限,以便将三种权限(r,w,x)量化为数字,对照表如下

r -> 4

w->2

x->1

每种身份(owner,group,others)的权限的数字表示是他拥有的权限所对应的数字的和。比如,文件test的文件拥有者Cherish对该文件的权限为  rw-即,可读可写,则量化为数字为:4(r) + 2(w) = 6,按照这种算法,文件test的权限如下:

owner = rw- = 4 + 2 = 6

group = r-- = 4 + 0 + 0 = 4

others = r-- = 4 + 0 + 0 = 4

这样的话,我们就可以用一个三位数来表示一个文件的权限啦!例如,test文件的权限是644!这样我们就可以方便的利用数字来设置一个文件的权限了。

例如,我们如果想将文件test分享给所有人,那么我们可以将该文件的权限设置为   rwxrwxrwx,计算数字权限得  777,那么我们可以这样做:

chomd [-R]  abc dir/file  abc就代表那个三位的数字权限啦!

[plain]  view plain copy
  1. [root@Cherish linux]# chomd [-R] abc dir/file  
  2. [root@Cherish linux]# ll test   
  3. -rw-r--r--. 1 Cherish Cherish 0 12月 11 22:36 test  
  4. [root@Cherish linux]# chmod 777 test  
  5. [root@Cherish linux]# ll test  
  6. -rwxrwxrwx. 1 Cherish Cherish 0 12月 11 22:36 test  
我们发现执行命令chmod 777 test后,文件test的权限真的变成了   rwxrwxrwx ,是不是很方便呢!

(2)符号类型权限

    数字权限虽然简洁,但是却不直观。Linux给我们提供了另外一种直观的符号类型权限设置方法!

    由前面介绍你可以知道,文件有owner(也就是user),group,others三种身份,我们分别用 u,g,o来分别代表着三种身份,用a同时代表三种身份,用r,w,x代表三种权限,用+,-,=三种符号分别代表添加,去除以及设置某种或某些权限的动作。那么我们就可以用这几种字符组合来灵活直观的设置文件权限啦!下面这个图其实是偷了鸟哥的,希望他老人家不要生气!

chmod u
g
o
a
+(添加)
-(去除)
=(设置)
r
w
x
dir/file

下面我们就举几个例子!

将test文件的文件权限设置为rwxrw-r--

[plain]  view plain copy
  1. [root@Cherish linux]# chmod u=rwx,g=rw,o=r test   
  2. [root@Cherish linux]# ll test   
  3. -rwxrw-r--. 1 root root 0 12月 12 09:39 test  

将test文件的others的 r 权限去掉!

[plain]  view plain copy
  1. [root@Cherish linux]# chmod o-r test   
  2. [root@Cherish linux]# ll test   
  3. -rwxrw----. 1 root root 0 12月 12 09:39 test  

我们看到test的others的r权限真的消失了!

我们再来将test 文件的  x 权限赋予所用身份:

[plain]  view plain copy
  1. [root@Cherish linux]# chmod a+x test   
  2. [root@Cherish linux]# ll test   
  3. -rwxrwx--x. 1 root root 0 12月 12 09:39 test  
这个命令在给可执行文件设置权限的时候很有用!

另外还有其他灵活的设置方式,如:

[plain]  view plain copy
  1. [root@Cherish linux]# chmod u=--- test  
  2. [root@Cherish linux]# ll test  
  3. ----rwx--x. 1 root root 0 12月 12 11:41 test  
  4. [root@Cherish linux]# chmod g= test  
  5. [root@Cherish linux]# ll test  
  6. ---------x. 1 root root 0 12月 12 11:41 test  

4.文件的默认权限和权限掩码

4.1文件的默认权限

    文件和目录创建的时候,都会有一个默认的权限。

    如果创建的是文件, 那么默认权限为   rw-rw-rw

    如果创建的是目录,则默认权限为 rwxrwxrwx

    我们可以创建一个文件看看:

[plain]  view plain copy
  1. [root@Cherish linux]# touch  test1  
  2. [root@Cherish linux]# ll test1  
  3. -rw-r--r--. 1 root root 0 12月 12 10:09 test1  
  4. [root@Cherish linux]# mkdir testdir  
  5. [root@Cherish linux]# ll -d testdir  
  6. drwxr-xr-x. 2 root root 4096 12月 12 10:09 testdir  
    什么?为啥跟默认权限对不上号呢?你忽悠我呢?别着急,这里还有一个umask的问题!我们知道要得到一个ip地址所在的网段,必须要将ip和子网掩码(netmask)相与才可以得到。这里类似ip的子网掩码,文件默认权限也有一个权限掩码(unmask),默认权限只有经过unmask的处理后,才能得到真正的默认权限,让我们来看看这个unmask吧!

4.2文件权限掩码(unmask)

[plain]  view plain copy
  1. [root@Cherish linux]# umask -->掩码的数字表示,我们只关注后三位数,第一位数后面会讲到!  
  2. 0022  
  3. [root@Cherish linux]# umask -S  -->掩码的字符表示(<span style="font-family:新细明体, 'Times New Roman', serif;font-size: 15px;">Symbolic</span>)  
  4. u=rwx,g=rx,o=rx  

注意,umask 并没有给出真正的默认权限,文件默认权限要经过umaks的处理才行!umask的意义就是屏蔽掉默认权限中的某些权限。

4.2.1数字形态的掩码

数字形态的掩码告诉我们要去掉的权限。比如上面的022(暂时只关注后三位数)代表文件默认权限需要拿掉group和others的w权限(因为w权限的数字表示是2!):

文件:默认权限(rw-rw-rw)       -      权限掩码(----w--w-)                =   真正的默认权限(rw-r--r--)

明白了吗?目录的处理方式也一样,请读者自行计算。这里我们也可以采用类似二进制相或的处理方式  (rw-rw-rw) || (----w--w-) = (110110110) || (000010010) = 110100100 = rw-r--r--

4.2.2字符形态的掩码

    看了数字形态的掩码后,读者是不是可以猜到字符形态的掩码的意义?字符型态的掩码意义,其实就是默认权限应该保留的权限,有点晕?没关系,我们举个例子就明白了。比如字符掩码中owner(user)的权限是u=rwx,这代表默认权限中的user如果有r权限,则保留;如果没有则不保留。文件的user的默认权限为  rw-,那么根据掩码,保留rw,由于没有x权限,则不保留。那么文件的user的最终默认权限为rw-,明白了吗?若果还是不明白,那就来个二进制相与吧!

文件:rw-rw-rw)  && (rwxr-x-r-x) = 110110110 && 111101101= 110100100 = rw-r--r--

这下明白了吧!

4.2.3.修改umask

    很简单umask后面直接接上修改后的值就可以了,这个值可以是数字形态的,也可以是字符形态的!

[plain]  view plain copy
  1. [root@Cherish linux]# umask 077  
  2. [root@Cherish linux]# umask   
  3. 0077  
  4. [root@Cherish linux]# umask u=rwx,g=rwx,o=rwx  
  5. [root@Cherish linux]# umask   
  6. 0000  
  7. [root@Cherish linux]# umask -S  
  8. u=rwx,g=rwx,o=rwx  

最后还有个有趣的现象,留给读者自己思考!

[plain]  view plain copy
  1. [root@Cherish linux]# chmod +x test  
  2. [root@Cherish linux]# ll test  
  3. -rwxr-xr-x. 1 root root 0 12月 12 11:46 test  
  4. [root@Cherish linux]# chmod +w test  
  5. [root@Cherish linux]# ll test  
  6. -rwxr-xr-x. 1 root root 0 12月 12 11:46 test  
  7. [root@Cherish linux]# chmod a+w test  
  8. [root@Cherish linux]# ll test  
  9. -rwxrwxrwx. 1 root root 0 12月 12 11:46 test  

5.文件权限的意义

        说了那么多文件权限相关的问题,那么,到底这些权限代表了什么意义呢?下面我们来分析下。

5.1文件权限对文件的意义

        这个不用太多解释你也明白,可读,可写,可执行。也就不罗嗦了。

5.2文件权限对目录的意义

        这个非常重要!一定要仔细理解!那到底r w x 对目录有什么意义呢?
         r:对于目录来说,具有r权限的身份可以利用ls查看该目录下的文件名列表, 不能查看文件的详细信息
         w:具有w权限的身份可以更改目录的内部结构,也就是说,你可以 删除、添加、移动、重命名文件
         x:具有x权限的身份可以利用cd 进入该目录作为自己的工作目录,在这个目录中,你可以访问、修改你有权限的文件,前提是你知道这个文件的文件名。
        明白了吧?!下面我们用一些例子来说明。我用root账号新建四个文件,分别给others身份r,rx,w,wx权限。然后用cherish账号登陆,来看看我们用cherish这个身份都能对这些文件进行哪些操作!
[plain]  view plain copy
  1. [cherish@Cherish ~]$ ll -d /tmp/tesdir_*  
  2. dr--r--r--. 3 root root 4096 12月 12 14:05 /tmp/tesdir_r       #只给others r权限  
  3. dr-xr-xr-x. 3 root root 4096 12月 12 14:05 /tmp/tesdir_rx      #给rx权限  
  4. d-w-----w-. 3 root root 4096 12月 12 14:05 /tmp/tesdir_w       #给w权限  
  5. d-wx--x-wx. 3 root root 4096 12月 12 14:10 /tmp/tesdir_wx      #给wx权限  
  6. [cherish@Cherish ~]$ ll /tmp/tesdir_r       -->只能查看文件名,详细信息不能看哦!  
  7. ls: 无法访问/tmp/tesdir_r/testfile: 权限不够  
  8. 总用量 0  
  9. d????????? ? ? ? ?            ? testfile  
  10. [cherish@Cherish ~]$ ll /tmp/tesdir_rx/    -->终于可以查看详细信息了!当然,你也可以用cd进入这个文件!  
  11. 总用量 4  
  12. drwxr-xr-x. 2 root root 4096 12月 12 14:05 testfile  
  13. [cherish@Cherish ~]$ mkdir /tmp/tesdir_w/chenbin     -->有w权限是不够的,必须同时具有x权限才可以修改目录内的结构!记住了!  
  14. mkdir: 无法创建目录"/tmp/tesdir_w/chenbin": 权限不够  
  15. [cherish@Cherish ~]$ mkdir /tmp/tesdir_wx/chenbin    -->可以创建啦!  
  16. [cherish@Cherish ~]$ cd /tmp/tesdir_r  
  17. tesdir_r/  tesdir_rx/   
  18. [cherish@Cherish ~]$ cd /tmp/tesdir_r  
  19. -bash: cd: /tmp/tesdir_r: 权限不够  

        一开始接触这些东西的确让人很感觉很坑爹!但是多多练习多多揣摩后悔发现,Linux真的很强大!学会了这些,你就不用像在windows下面一样,想隐藏某些文件的时候,还要用拙劣的“隐藏文件”,或者大动干戈的下个神马文件加密软件。在Linux下面只要一两条命令就搞定了,是不是很强大呢?!
        

6.文件的隐藏权限

        未完待续!