红联Linux门户
Linux帮助

Linux文件权限之不完全解析

发布时间:2014-07-30 11:03:18来源:linux网站作者:sinchb

本文着重介绍与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文件的权限

[root@linux110 linux]# touch test  -->创建一个空文件!
[root@linux110 linux]# ls -al    -->显示文件属性!
总用量 8
drwxr-xr-x.  2 root root 4096 12月 11 22:36 .
dr-xr-x---. 37 root root 4096 12月 11 22:32 ..
-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

[root@linux110 linux]# ll test
-rw-r--r--. 1 root root 0 12月 11 22:36 test
[root@linux110 linux]# chown linux110 test
[root@linux110 linux]# ll test
-rw-r--r--. 1 linux110 root 0 12月 11 22:36 test

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

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

[root@linux110 linux]# ll test
-rw-r--r--. 1 linux110 root 0 12月 11 22:36 test
[root@linux110 linux]# chgrp linux110 test
[root@linux110 linux]# ll test
-rw-r--r--. 1 linux110 linux110 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就代表那个三位的数字权限啦!

[root@linux110 linux]# chomd [-R] abc dir/file
[root@linux110 linux]# ll test
-rw-r--r--. 1 linux110 linux110 0 12月 11 22:36 test
[root@linux110 linux]# chmod 777 test
[root@linux110 linux]# ll test
-rwxrwxrwx. 1 linux110 linux110 0 12月 11 22:36 test

我们发现执行命令chmod 777 test后,文件test的权限真的变成了  rwxrwxrwx ,是不是很方便呢!

(2)符号类型权限

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

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

下面我们就举几个例子!

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

[root@linux110 linux]# chmod u=rwx,g=rw,o=r test
[root@linux110 linux]# ll test
-rwxrw-r--. 1 root root 0 12月 12 09:39 test

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

[root@linux110 linux]# chmod o-r test
[root@linux110 linux]# ll test
-rwxrw----. 1 root root 0 12月 12 09:39 test

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

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

[root@linux110 linux]# chmod a+x test
[root@linux110 linux]# ll test
-rwxrwx--x. 1 root root 0 12月 12 09:39 test

这个命令在给可执行文件设置权限的时候很有用!

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

[root@linux110 linux]# chmod u=--- test
[root@linux110 linux]# ll test
----rwx--x. 1 root root 0 12月 12 11:41 test
[root@linux110 linux]# chmod g= test
[root@linux110 linux]# ll test
---------x. 1 root root 0 12月 12 11:41 test


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

4.1文件的默认权限

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

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

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

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

[root@linux110 linux]# touch  test1
[root@linux110 linux]# ll test1
-rw-r--r--. 1 root root 0 12月 12 10:09 test1
[root@linux110 linux]# mkdir testdir
[root@linux110 linux]# ll -d testdir
drwxr-xr-x. 2 root root 4096 12月 12 10:09 testdir

什么?为啥跟默认权限对不上号呢?你忽悠我呢?别着急,这里还有一个umask的问题!我们知道要得到一个ip地址所在的网段,必须要将ip和子网掩码(netmask)相与才可以得到。这里类似ip的子网掩码,文件默认权限也有一个权限掩码(unmask),默认权限只有经过unmask的处理后,才能得到真正的默认权限,让我们来看看这个unmask吧!

4.2文件权限掩码(unmask)

[root@linux110 linux]# umask -->掩码的数字表示,我们只关注后三位数,第一位数后面会讲到!
0022
[root@linux110 linux]# umask -S  -->掩码的字符表示(Symbolic)
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后面直接接上修改后的值就可以了,这个值可以是数字形态的,也可以是字符形态的!

[root@linux110 linux]# umask 077
[root@linux110 linux]# umask
0077
[root@linux110 linux]# umask u=rwx,g=rwx,o=rwx
[root@linux110 linux]# umask
0000
[root@linux110 linux]# umask -S
u=rwx,g=rwx,o=rwx

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

[root@linux110 linux]# chmod +x test
[root@linux110 linux]# ll test
-rwxr-xr-x. 1 root root 0 12月 12 11:46 test
[root@linux110 linux]# chmod +w test
[root@linux110 linux]# ll test
-rwxr-xr-x. 1 root root 0 12月 12 11:46 test
[root@linux110 linux]# chmod a+w test
[root@linux110 linux]# ll test
-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这个身份都能对这些文件进行哪些操作!

[linux110@linux110 ~]$ ll -d /tmp/tesdir_*
dr--r--r--. 3 root root 4096 12月 12 14:05 /tmp/tesdir_r      #只给others r权限
dr-xr-xr-x. 3 root root 4096 12月 12 14:05 /tmp/tesdir_rx      #给rx权限
d-w-----w-. 3 root root 4096 12月 12 14:05 /tmp/tesdir_w      #给w权限
d-wx--x-wx. 3 root root 4096 12月 12 14:10 /tmp/tesdir_wx      #给wx权限
[linux110@linux110 ~]$ ll /tmp/tesdir_r      -->只能查看文件名,详细信息不能看哦!
ls: 无法访问/tmp/tesdir_r/testfile: 权限不够
总用量 0
d  testfile
[linux110@linux110 ~]$ ll /tmp/tesdir_rx/    -->终于可以查看详细信息了!当然,你也可以用cd进入这个文件!
总用量 4
drwxr-xr-x. 2 root root 4096 12月 12 14:05 testfile
[linux110@linux110 ~]$ mkdir /tmp/tesdir_w/chenbin    -->有w权限是不够的,必须同时具有x权限才可以修改目录内的结构!记住了!
mkdir: 无法创建目录"/tmp/tesdir_w/chenbin": 权限不够
[linux110@linux110 ~]$ mkdir /tmp/tesdir_wx/chenbin    -->可以创建啦!
[linux110@linux110 ~]$ cd /tmp/tesdir_r
tesdir_r/  tesdir_rx/
[linux110@linux110 ~]$ cd /tmp/tesdir_r
-bash: cd: /tmp/tesdir_r: 权限不够


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