DomBro Studio

Linux的文件权限与目录配置

2017/12/11

目录

1. Linux文件权限

Linux最优秀的地方之一,就在于它的多用户、多任务环境。而为了让各个用户具有较保密的文件数据,因此文件的权限管理就变得很重要了。Linux一般将文件可存取访问的身份分为 3 个类别,分别是owner、group、others,且 3 种身份各有read、write、execute等权限。

1.1 用户与用户组

  • 文件所有者(用户)

 由于 Linux 是多用户多、多任务的系统,因此可能常常会有很多人同时在这套主机来进行工作的情况发生,为了考虑每个人的隐私权以及每个热洗好的工作环境,因此 “文件所有者” 的概念就显得相当重要

 例如当你将你的Email情书转存成文件之后,放在你自己的主文件夹中,你总不希望被其他人看见自己的情书吧?这个时候你就把该文件设置成只有文件所有者才能查看与修改这个文件的内容,那么即使其他人知道你有这个相当“有趣”的文件,不过由于你有设置适当的权限,所以其他人自然也就无法知道该文件的内容

  • 用户组

 其实用户组最有用的功能之一,就是当你在团队开发资源的时候。不同团体之间是有竞争性质的,但却要交纳同一份报告。每组的组员之间必须要能够互相修改对方的数据,但是其他组的组员则不能看到本组自己的文件内容,此时该如何是好?

 在Linux下面这样的限制是很简单的,可以进行简单的文件权限设置,就能限制非自己团队(也即是用户组)的其他人不能够阅览内容,而且也可以让自己的团队成员可以修改你所创建的文件。同时,如果你自己还有私人隐密的文件,仍然可以设置成让自己的团队成员也看不到我的文件数据。

不过 root 用户(超级用户)可以到达任何他想去的地方哦!

  • Linux 用户身份与用户组记录的文件

Linux 系统中,默认所有系统账号与一般身份用户和 root 相关信息都记录在 /etc/passwd 这个文件内可以使用 cat命令查看该文件中是否有指定用户。所有用户组名都记录在 /etc/group 文件内,同样可以使用 cat查看。个人密码记录在 /etc/shadow 文件下(默认只用 root 才可以打开这个文件)。

1.2 Linux文件权限概念

  • Linux 文件属性

以 root 身份登录 Linux 执行 ls -al(list命令,显示文件档案相关属性, 常用命令 -l)

[root@www ~]# ls -al

total 156

drwxr-x— 4 root root 4096 Sep 8 14:06 .

drwxr-xr-x 23 root root 4096 Sep 8 14:21 ..

-rw——- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg

-rw——- 1 root root 199 Sep 8 17:14 .bash_history

-rw-r–r– 1 root root  24 Jan 6 2007 .bash_logout

-rw-r–r– 1 root root 191 Jan 6 2007 .bash_profil
-rw-r–r– 1 root root 176 Jan 6 2007 .bashrc

-rw-r–r– 1 root root 100 Jan 6 2007 .cshrc

drwx—— 3 root root 4096 Sep 5 10:37 .gconf <=范例说明处

drwx—— 2 root root 4096 Sep 5 14:09 .gconfd`

-rw-r–r– 1 root root 42304 Sep 4 18:26 install.log <=范例说明处

-rw-r–r– 1 root root 5661 Sep 4 18:25 install.log.syslog

[1]    [2]  [3] [4] [5] [ 6   ]  [7]

[1权限 ]   [2连接] [3所有者]  [4用户组] [5文件容量]   [6修改日期] [7文件名]

  • 第一列权限与文件类型

仔细看的话,会发现这里共有十个字符

第一个字符代表这个文件是“目录、文件或链接文件等”。

若是[d]则是目录,例如上面文件名为“.gconf”的第11行。

若是[-]则是文件,例如上面文件名为“install.log”第5行。

若是[l]则表示为连接文件(linkfile)。

若是[b]则表示设备文件里面的可供存储的接口设备。

若是[c]则表示设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)。

接下来的字符中,以3个为一组,且均为“rwx”的3个参数的组合其中[r]代表可读(read), [w]代表可写(write),[x]代表可执行(execute)。要注意的是,这3个权限的位置不会改变如果没有权限,就会出现减号[-]而已

  • 其他列解释

根据每列的名字可以看出个大概,此处省略,大家可以戳这里《看看鸟哥的Linux私房菜》是怎么说的。

  • 改变文件属性与权限

chgrp:改变文件所属用户组

chgrp改变一个文件的用户组真是很简单的,直接以chgrp来改变即可,这个命令就是change group的简称。不过,请记得,要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误。

[root@www ~]# chgrp [-R] dirname/filename …

选项与参数:

-R : 进行递归(recursive)的持续更改,也即连同子目录下的所有文件、目录都更新成为这个用户组之意。常常用在更改某一目录内所有的文件情况。

范例:

[root@www ~]# chgrp users install.log

[root@www ~]# ls -l

-rw-r–r– 1 root users 68495 Jun 25 08:53 install.log

chown:改变文件所有者

[root@www ~]# chown [-R] 账号名称 文件或目录

[root@www ~]# chown [-R] 账号名称:组名 文件或目参数:
-R : 进行递归(recursive)的持续更改,即连同子目录下的所有文件都更改

范例:将install.log的所有者改为bin这个账号:

[root@www ~]# chown bin install.log

[root@www ~]# ls -l

-rw-r–r– 1 bin users 68495 Jun 25 08:53 install.log

范例:将install.log的所有者与用户组改回为root:

[root@www ~]# chown root:root install.log

[root@www ~]# ls -l

-rw-r–r– 1 root root 68495 Jun 25 08:53 install.log

chmod:改变文件的权改变所属用户组
文件权限的改变使用的是chmod这个命令,但是权限的设置方法有两种,分别可以使用数字或者是符号来进行权限的更改。

数字类型改变文件权限 :

Linux文件的基本权限就有9个,分别是owner、group、others三种身份各有自己的read、write、execute权限,先复习一下刚刚上面提到的数据:文件的权限字符为“-rwxrwxrwx”,这 9 个权限是三个三个一组的。其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

r:4

w:2

x:1

每种身份(owner、group、others)各自的三个权限(r、w、x)分数是需要累加的,例如当权限为 [-rwxrwx—],分数则是:

owner = rwx = 4+2+1 = 7

group = rwx = 4+2+1 = 7

others= — = 0+0+0 = 0

所以等一下我们设置权限的更改时,该文件的权限数字就是770,更改权限的命令chmod的语法是这样的:

[root@www ~]# chmod [-R] xyz 文件或目录

参数:

xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。

-R : 进行递归(recursive)的持续更改,即连同子目录下的所有文件都会更改

举例来说,如果要将.bashrc这个文件所有的权限都设置启用,那么就执行

[root@www ~]# ls -al .bashrc

-rw-r–r– 1 root root 395 Jul 4 11:45 .bashrc

[root@www ~]# chmod 777 .bashrc

[root@www ~]# ls -al .bashrc

-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc

符号类型改变文件权限 :

user(u):具有可读、可写、可执行的权限;

group与others(g/o):具有可读与执行的权限。

所以就是:

[root@www ~]# chmod u=rwx,go=rx .bashrc

注意:那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格

[root@www ~]# ls -al .bashrc

-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc

那么假如是“-rwxr-xr”这样的权限呢?可以使用“ chmod u=rwx,g=rx,o=r filename”来设置
如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限,那么我就可以使用:

[root@www ~]# ls -al .bashrc
[root@www ~]# chmod a+w .bashrc

[root@www ~]# ls -al .bashrc

-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc

而如果是要将权限去掉而不更改其他属性呢?例如要去掉全部人的可执行权限,则:

[root@www ~]# chmod a-x .bashrc

[root@www ~]# ls -al .bashrc

-rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc

  • 权限对 文件 的重要性

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

   r(read):可读取此文件的实际内容,如读取文本文件的文字内容等。

   w(write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件)。

   x(eXecute):该文件具有可以被系统执行的权限。

 可执行(x)权限,这里必须要小心啦!因为在 Windows 下面一个文件是否具有执行的能力是通过“扩展名”来判断的,例如.exe,.bat,.com等,但是在Linux下面,我们的文件是否能被执行则是由是否具有“x”这个权限来决定,而跟文件名是没有绝对的关系

 至于最后一个w权限呢?当你对一个文件具有w权限时,你可以具有写入、编辑、新增修改文件的内容的权限,但并不具备删除该文件本身的权限对于文件的 r、w、x 来说,主要都是针对“文件的内容”而言,与文件名的存在与否没有关系的。因为文件记录的是实际的数据

  • 权限对目录的重要性

 文件是存放实际数据的所在,目录主要的内容是记录文件名列表,文件名与目录有强烈的关联。所以如果是针对目录时,那个r、w、x对目录是什么意义呢?

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

  w(modify contents of directory)
这个可写入的权限对目录来说是很强大的。因为它表示你具有更改该目录结构列表的权限,也就是下面这些权限:

    新建新的文件与目录;

    删除已经存在的文件与目录(不论该文件的权限为何)将已存在的文件或
目录进行重命名;

    转移该目录内的文件、目录位置。
总之,目录的w权限就与该目录下面的文件名变动有关就对了。

  x(access directory)
目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错,目录不可以被执行,目录的 x 代表的是用户能否进入该目录成为工作目录的用途,所谓的工作目录(work directory)就是你目前所在的目录。举例来说,当你登录 Linux时,你所在的主文件夹就是你当下的工作目录。而变换目录的命令是“cd” (change directory)

2. Linux目录配置

 Linux 发行版本和开发团队或公司实在太多了。如何保证你所接触到的 Linux 目录配置方法和之前学习的 Linux 系统的目录配置一样,这就出现了后来的 Filesystem Hierarchy Standard (FHS)标准的出炉。

 根据 FHS: http://www.pathname.com/fhs/ 的官方文件指出,其主要目的是希望让用户可以了解到已安装软件通常放置于那个目录下,所以其希望独立的软件开发商、操作系统制作者以及想要维护系统的用户,都能够遵循FHS的标准。也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格

 事实上,FHS是根据过去的经验一直在持续改版的,FHS依据文件系统使用的频繁与否与是否允许用户随意改动,而将目录定义成为四种交互作用的形态

可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录。

不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等,由于仅与自身机器有关,所以当然就不适合分享给其他主机了。

不变的:有些数据是不会经常变动的,跟随着distribution而不变动。例如函数库、文件说明文件、系统管理员所管理的主机服务配置文件等。

可变动的:经常改变的数据,例如登录文件、新闻组等。

2.1 Linux目录配置

  • FHS 目录树架构

FHS 针对目录树架构金鼎移除三层目录下面应该放置什么数据,分别是

/(root,根目录):与开机系统有关;

/usr(UNIX software resource):与软件安装/执行有关;

/var(variable):与系统运作过程有关。

  • 根目录( / ) 的意义与内容

 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机、还原、系统修复等操作有关。由于系统开机时需要特定的开机软件、内核文件、开机所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。因为根目录是这么重要,所以在FHS的要求方面,其希望根目录不要放在非常大的分区内,因为越大的分区录所在分区就可能会有较多发生错误的机会。

 因此FHS标准建议:根目录(/)所在分区应该越小越好且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较好,根目录所在的文件系统也较不容易发生问题

有鉴于上述的说明,因此 FHS 定义出根目录(/)下面应该要有下面这些子目录的存在才好

FHS 针对根目录所定义的标准金上面图片中举例数据,不过 Linux 下面还有许多目录也需要了解,下面是几个在 Linux 当中也是非常重要的目录

  • 不可与根目录分开的目录

 因为根目录与开机有关,开机过程中仅有根目录会被挂载,其他分区则是在开机完成之后才会持续进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录就不能够与根目录放到不同的分区去。有下面
 /bin:重要执行文件

 /etc: 配置文件

 /dev:所需要的设备文件

 /lib:执行文件所需的函数库与内核所需的模块

 /sbin:重要的系统执行文件

这五个目录千万不可与根目录分开放在不同的分区

  • /usr 的意义与内容

 依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable,static),如果你知道如何通过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网内的其他主机来使用。

 其实 usr 是 UNIX Software Resource 的缩写,也就是“UNIX 操作系统软件资源”所放置的目录,而不是用户的数据。这点要注意。FHS建议所有软件开发者应该将他们的数据合理地分别放置到这个目录下的子目录,而不要自行新建该软件自己独里的目录
 因为是所有系统默认的软件(distribution 发布者提供的软件)都会放置到/usr 下面,因此这个目录有点类似 Windows 系统的“C:\Windows\”和“C:\Program files\”这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的子目录建议有下图所示的这些


  • /var 的意义与内容

如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录因为/var目录主要针对常态性变动的文件,包括缓存(cache)、登录文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file,run file),或者例如 MySQL数据库的文件等。


  • 目录树

 所有的文件与目录都是由根目录开始的。那是所有目录与文件的源头。然后再一个一个分支下来,有点像是树枝状。因此我们也称这种目录配置方式为“目录树(directorytree)”
这个目录树有什么特性呢?它主要的特性有:

  ·目录树的起始点为根目录(/,root);

  ·每一个目录不只能使用本地端的文件系统,也可以使用网络上的文件系统。举例来说,可以利用Network File System(NFS)服务器挂载某特定目录等。

  ·每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

 

说明

整理笔记参考了 《鸟哥的Linux私房菜》 一书。这本书我是买的京东阅读的正版电子书籍。

如果不想买书看的话可以直接戳这里进入鸟哥Linux私房菜的线上博客 : http://linux.vbird.org/。请大家支持正版!!

CATALOG
  1. 1. 目录
  2. 2. 1. Linux文件权限
    1. 2.1. 1.1 用户与用户组
    2. 2.2. 1.2 Linux文件权限概念
  3. 3. 2. Linux目录配置
    1. 3.1. 2.1 Linux目录配置
    2. 3.2. 说明