Linux文件属性与权限的管理

1. Linux文件属性与权限的含义

首先我们以root用户的身份登陆Linux,执行ls -al查看文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@layne ~]# ls -al
total 2104
dr-xr-x---. 8 root root 4096 Feb 8 18:17 .
dr-xr-xr-x. 22 root root 4096 Feb 8 11:13 ..
-rw-r--r-- 1 root root 39974 Jan 28 15:36 1611819376845.png
-rw-------. 1 root root 903 Feb 3 03:44 anaconda-ks.cfg
drwxr-xr-x 4 root root 4096 Feb 6 18:25 b7
-rw-------. 1 root root 13726 Feb 7 21:39 .bash_history
-rw-r--r--. 1 root root 18 May 20 2009 .bash_logout
-rw-r--r--. 1 root root 176 May 20 2009 .bash_profile
-rw-r--r-- 1 root root 229 Feb 3 23:59 .bashrc
-rw-r--r--. 1 root root 100 Sep 23 2004 .cshrc
...

ls是list的缩写,能显示文件的文件名和相关属性。而-al表示列出所有的文件详细的权限与属性(包含隐藏文件,诸如文件名以“.”开头的文件)。显示信息详细含义如下:

(1)第一列

第一列代表这个文件的类型与权限(permission),仔细看可以发现其中总共有10个字符。

任何设备在Linux下都是文件。上述10个字符的第一个字符表示文件的类型,文件的类型有:

  • 若是[d]则是目录(directory)

  • 若是[-]则是文件

  • 若是[l]则是链接文件(link), 类似window系统下的快捷方式。

  • 块设备文件[b]

  • 字符设备文件[c]

  • 数据接口文件(sockets)[s]

  • 数据输送文件(FIFO,pipe)[p]

    与系统外设和存储等相关的一些文件,通常都集中在/dev这个目录中。分为两种:

A. 块(block)设备文件[b]:就是一些存储数据,以提供系统随机访问的接口设备,例如硬盘、软盘等。你可以随机的在硬盘的不同块读写,这种设备就是成组设备。

例如:

1
2
3
4
5
6
[root@layne ~]# ls -al /dev | grep sda
lrwxrwxrwx 1 root root 4 Feb 8 11:13 root -> sda3
brw-rw---- 1 root disk 8, 0 Feb 8 11:13 sda
brw-rw---- 1 root disk 8, 1 Feb 8 11:13 sda1
brw-rw---- 1 root disk 8, 2 Feb 8 11:13 sda2
brw-rw---- 1 root disk 8, 3 Feb 8 11:13 sda3

B. 字符(character)设备文件[c]:是一些串行端口的接口设备,例如键盘,鼠标。这些设备的特征就是“一次性读取”的,不能够截断输出。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@layne ~]# ls -al /dev | grep vcs
crw-rw---- 1 vcsa tty 7, 0 Feb 8 11:13 vcs
crw-rw---- 1 vcsa tty 7, 1 Feb 8 11:13 vcs1
crw-rw---- 1 vcsa tty 7, 2 Feb 8 11:14 vcs2
crw-rw---- 1 vcsa tty 7, 3 Feb 8 11:14 vcs3
crw-rw---- 1 vcsa tty 7, 4 Feb 8 11:14 vcs4
crw-rw---- 1 vcsa tty 7, 5 Feb 8 11:14 vcs5
crw-rw---- 1 vcsa tty 7, 6 Feb 8 11:14 vcs6
crw-rw---- 1 vcsa tty 7, 128 Feb 8 11:13 vcsa
crw-rw---- 1 vcsa tty 7, 129 Feb 8 11:13 vcsa1
crw-rw---- 1 vcsa tty 7, 130 Feb 8 11:14 vcsa2
crw-rw---- 1 vcsa tty 7, 131 Feb 8 11:14 vcsa3
crw-rw---- 1 vcsa tty 7, 132 Feb 8 11:14 vcsa4
crw-rw---- 1 vcsa tty 7, 133 Feb 8 11:14 vcsa5
crw-rw---- 1 vcsa tty 7, 134 Feb 8 11:14 vcsa6

总结:设备文件是我们系统很重要的文件,最好不要随意修改之外(通常它也不会让你修改的);另外一个比较有趣的文件就是链接文件,类似window的桌面快捷方式,同样可以将linux下的连接文件简单的视为一个文件或目录的快捷方式。

数据接口文件(sockets):

既然被称为数据接口文件,这种类型ss的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求,而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为[ s ],最常在/var/run目录中看到这种文件类型了。

数据输送文件(FIFO,pipe):

FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO是first-in-first-out的缩写(先进先出)。第一个属性为[p]。

上述10个字符的后9个字符,三个一组,且均为[rwx]的3个参数组合。

其中[r]代表可读(read),[w]代表可写(write),[x]代表可执行(excute)。

这三个参数的出现顺序不会改变,若没有某个权限,则会以[-]代替。这三组参数中,第一组是文件所有者的权限;第二组是同用户组的权限;第三组是其他用户的权限。这三组权限均是针对某些账号而言的权限。另外,文件权限和目录权限意义不同,这是因为文件与目录记录的数据内容不相同,后面我们会详细叙述。

(2)第二列

第二列表示有多少文件名链接到此节点(i-node)。

每个文件都会将他的权限与属性记录到文件系统的i-node中,但是Linux所使用的目录树却是使用文件名来记录,因此每个文件名就会链接到一个i-node。这个属性记录的就是有多少不同的文件名链接到相同的一个i-node号码

(3)第三列

第三列表示这个文件(或目录)的所有者账号

(4)第四列

第四列表示这个文件的所属用户组。

在Linux系统下,每个账号会附属于一个或多个用户组中(一个主组,多个附加组)。

(5)第五列

第五列表述这个文件的容量大小,默认单位为bytes 。目录前面的数字都是4096,不是表示整个目录的大小。而文件前面的数字表示该文件的大小。

(6)第六列

第六列为这个文件的创建文件日期或者是最近的修改日期

如果想要显示完整的时间格式,可以使用ls参数,即”ls -l --full-time”,这样做就可以显示出完整的时间格式。

(7)第七列

第七列为该文件名

注意,前缀为”.”的是隐藏文件。

Linux文件权限最大的用途实在数据安全性上,它能根据不同用户的不同权限实现对不同文件的操作。为此,在我们设置Linux文件与目录的属性之前,需要弄清到底什么数据是可变的,什么数据是不可变的。

2. Linux文件属性与权限的管理

接下来,我们介绍几个常用于用户组,所有者,各种身份的权限的修改的命令:

​ chgrp:改变文件所属用户组 (chgrp 即 change group)

​ chown:改变文件所有者 (chang owner)

​ chmod:改变文件的权限 (change mode)

2.1 改变文件所属用户组

语法:chgrp [-R] 用户组 dirname/filename

参数:-R 表示如果为目录则递归修改组(该目录下的文件和目录都可以改)。

**作用:**使用chgrp命令可以改变一个文件的用户组,它是changegroup的简称。

**注意:**需要注意的是,要被改的组名必须要在/etc/group文件内存在才行,否则会报错。

**案例:**将a.txt和b.txt所属用户组改为lucy

1
2
3
4
5
6
7
8
9
10
11
[root@layne testdir]# ll
total 8
-rw-r--r-- 1 root root 33 Feb 8 15:59 a.txt
-rw-r--r-- 1 root root 0 Feb 7 18:35 b.txt
drwxr-xr-x 2 root root 4096 Feb 8 20:28 dir
[root@layne testdir]# chgrp lucy a.txt b.txt
[root@layne testdir]# ll
total 8
-rw-r--r-- 1 root lucy 33 Feb 8 15:59 a.txt
-rw-r--r-- 1 root lucy 0 Feb 7 18:35 b.txt
drwxr-xr-x 2 root root 4096 Feb 8 20:28 dir

将dir目录及该目录下所有的文件所属用户组改为lucy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@layne testdir]# ll
total 8
-rw-r--r-- 1 root lucy 33 Feb 8 15:59 a.txt
-rw-r--r-- 1 root lucy 0 Feb 7 18:35 b.txt
drwxr-xr-x 2 root root 4096 Feb 8 20:28 dir
[root@layne testdir]# ll dir
total 8
-rw-r--r-- 1 root root 204 Feb 8 20:28 sed.txt
-rw-r--r-- 1 root root 989 Feb 8 20:28 succ.log
[root@layne testdir]# chgrp -R lucy dir
[root@layne testdir]# ll dir
total 8
-rw-r--r-- 1 root lucy 204 Feb 8 20:28 sed.txt
-rw-r--r-- 1 root lucy 989 Feb 8 20:28 succ.log
[root@layne testdir]# ll
total 8
-rw-r--r-- 1 root lucy 33 Feb 8 15:59 a.txt
-rw-r--r-- 1 root lucy 0 Feb 7 18:35 b.txt
drwxr-xr-x 2 root lucy 4096 Feb 8 20:28 dir

2.2 改变文件所有者

语法chown [-R] 用户账号 dirname/filename

chown [-R] 用户账号:用户组名 dirname/filename

**作用:**使用chown命令可以改变一个文件的所有者,还可以直接修改群组的名称;它是changeowner的缩写。

**注意:**用户必须是已经存在于系统中的账号,也就是在/etc/passwd这个文件中有记录的用户名称才能改变。如果要将目录下的所有子文件或目录同时改变文件所有者,加-R参数即可。

案例:

chown -R root:root etc 将etc目录及目录下所有的目录和文件 的所有者和所属用户组改为root

chown lucy install.log 将install.log的所有者改为lucy用户

通过实例我们可以修改文件的用户组和所有者,那么什么时候使用chown,什么时候使用chgrp呢?我们举个例子:复制文件给其他用户,我们使用cp命令:

假设我们要将profile这个文件复制成为profile_test文件名,并且要将他给lucy这个用户使用,做法如下:

1
2
3
4
5
6
7
8
[root@layne tdir]# ll
total 4
-rw-r--r-- 1 root root 1896 Feb 8 20:39 profile
[root@layne tdir]# cp profile profile_test
[root@layne tdir]# ll
total 8
-rw-r--r-- 1 root root 1896 Feb 8 20:39 profile
-rw-r--r-- 1 root root 1896 Feb 8 20:40 profile_test

不难发现,cp命令会复制执行者的属性与权限,profile_test还是归root所有。因此,lucy拿到该文件是无权进行操作的。所以你需要修改这个文件的所有者和用户组。

2.3 改变文件权限

语法chmod [-R] mode dirname/filename

**作用:**文件或目录权限的改变使用的是chmod(change file mode bits)这个命令。

**注意:**权限的设置方法分两种,可以通过数字或符号进行修改。-R含义同上

(1)数字类型改变文件权限

Linux的基本权限有9个,分别是owner,group,others三种身份各自的read,write,excute权限,各个权限对应的数字如下:

1
r:4、w:2、x:1

为此每种身份各自的三个权限数字相加即可得出数字表示的权限。

例如,-rwxrwx可以表示为:

1
2
3
owner = rwx = 4+2+1 = 7
group = r-x = 4+1 = 5
others= --- = 0+0+0 = 0

最终得到的数字肯定是唯一的。

数字分别表示为:

  • 7代表rwx
  • 6代表rw-
  • 5代表r-x
  • 4代表r–
  • 3代表-wx
  • 1代表–x
  • 0代表—

范例:将文件a.txt的用户组权限改为r-x,所有者和other的权限不变

1
2
3
4
5
[root@layne testdir]# ll a.txt
-rw-r--r-- 1 root lucy 33 Feb 8 15:59 a.txt
[root@layne testdir]# chmod 654 a.txt
[root@layne testdir]# ll a.txt
-rw-r-xr-- 1 root lucy 33 Feb 8 15:59 a.txt

(2)符号类型改变文件权限

另一种改变权限的方法就是通过符号了。上文提到,Linux总共9种权限,对应着三种身份,为此我们可以通过u,g,o代表三种身份,另外a代表全部身份。对应的权限可以写为r,w,x,如下图所示:

u是user,g是group,o是others,a是all

+是加一个权限,等号是设定最终的结果,-是在原来的基础上减一个。

  • chmod g+w test.sh 给该文件的用户组加一个w权限
  • chmod u=rwx,go=rx a.txt 给该文件所有者设定rwx权限,用户组和其它人设定rx权限。
  • chmod u=rwx,g=rx,o=r b.txt 给该文件分别设定权限

a-x等于 -x,a+等于+x

  • chmod a-x a.txtchmod -x a.txt 给该文件的所有者、用户组、其他人减去一个x权限
  • chmod a+r a.txtchmod +r a.txt 给该文件的所有者、用户组、其他人加上一个r权限

3. 目录与文件的权限意义

3.1 权限对文件的重要性

文件是实际含有数据的地方,包括一般文本文件,数据库内容文件,二进制可执行文件(binary program)等等,因此,文件权限有如下意义:

  • r(read):可读取此文件的实际内容,如读取文本文件的文字内容等;
  • w(write):可以编辑、新增或者是修改该文件的内容
  • x(execute):该文件具有可以被系统执行的权限。

注意:在Linux中,文件是否能被执行是由是否具有”x”这个权限来决定,与拓展名无关。

3.2 权限对目录的重要性

  • r(read contents in directory):表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。所以你就可以利用ls这个指令将该目录的内容列表显示出来。

  • w(modify contents of directory):这个可写入的权限对目录来说,表示你具有改变目录结构清单的权限,也就是底下这些权限:

    • 建立新的文件或子目录
    • 删除已经存在的文件或子目录(不论该文件的权限
    • 将已存在的文件或目录进行重命名;
    • 移动该目录内的文件、目录位置。
  • x(access directory):在Linux中,目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途。所谓的工作目录(work directory)就是你目前所在的目录。举例来说,当你登入Linux时,你所在的Home目录就是你当下的工作目录。

如果你对一个目录用rw权限,没有x权限,即不能作为工作目录,则你可以在目录外面对目录里面的文件进行创建和删除,但是不能cd到里面里面操作。

综上: