鸟哥的Linux私房菜第五章学习笔记

第5章 Linux的文件权限与目录配置

一、要点总结

5.1 文件权限

5.1.1 基于身份的权限区分

  • Linux是一个多人多任务环境,为了让各个用户拥有自己的隐私又可以彼此合作,Linux设计了一套基于身份的文件权限管理系统,用户组是其中的核心。
  • Linux下将对文件的操作权限使用三种身份进行区分:拥有者(Owner)或用户(User)、所属群组(Group)和其他人(Others),每种身份各自设置有读(r, read)、写(w, write)、执行(x, execute)三种权限。特别的,root不受任何文件权限的限制。
  • 每个User都可以有多个用户组的支持。
  • 在默认情况下,系统上所有账号包括一般身份用户和root的相关信息都记录在/etc/passwd这个文件内,个人密码则记录在/etc/shadow文件内。此外,Linux所有的组名都记录在/etc/group中。

5.1.2 查看文件属性和权限

  • 利用ls -al可以展示出目录内所有文件属性,其中ls是list的意思,用于显示文件的文件名和相关属性;-a表示列出所有文件(包括**【.】开头的隐藏文件**),-l表示列出文件详细的属性和权限。

  • ls -al结果有7栏数据,每栏的意义和说明如下:

    1
    2
    3
    ls -al
    # 取一行输出,共有7栏如下
    # -rw-r--r--. 1 root root 176 12月 29 2013 .shellrc
    • 第一栏【-rw-r–r–】表示这个文件的类型和权限
      • 第一个字符代表文件类型,具体可以参考【5.1.5】节。一些常用的可以记下来:【d】表示目录,【-】表示文件,【l】表示链接文件。
      • 接下来的字符三个为一组,分别代表用户、用户组和其他人三个身份的rwx权限。如果没有权限,对应位上就会出现减号【-】。
    • 第二栏【1】表示有多少文件名链接到此节点(inode)
      • 每个文件都会将它的权限和属性记录到文件系统的inode中,不过,我们使用的目录树却是使用文件名来记录,因此每个文件名就会链接到一个inode,这个属性记录的就是有多少不同的文件名链接到相同的一个inode上。
    • 第三栏【root】表示这个文件的拥有者
    • 第四栏【root】表示这个文件的所属用户组
    • 第五栏【176】表示这个文件的容量大小,默认单位为字节Bytes
    • 第六栏【12月 29 2013】表示这个文件的创建日期或事最近的修改日期
      • 如果这个文件被修改的时间距离现在太久,那么时间部分会仅显示年份而已。
      • 如果想要显示完整的时间格式,可以加上--full-time选项。
    • 第七栏为文件名

5.1.3 修改文件属性和权限

  • 修改所属用户组chgrp

    • 是change group的缩写。
    • 要修改的组名必须要在/etc/group文件中存在,否则会报错。
    1
    2
    chgrp [-R] groupname dirname/filename ...
    # -R表示递归(recursive)修改,即目录下所有文件、目录都更新为这个用户组的意思。
  • 修改文件拥有者chown

    • 是change owner的缩写。
    • 要修改的用户名必须要在/etc/passwd文件中存在,否则会报错。
    • 可以直接顺便修改用户组。
    1
    2
    chown [-R] username dirname/filename
    chown [-R] username:groupname dirname/filename
    • 这里【:】也可以用【.】替换,但是考虑到linux里用户设置账户时可能加入小数点,用【.】容易造成系统的误判,所以用【:】更保险。
    • chgrpchown在复制文件的时候很常用,因为复制操作(cp)会复制执行者的属性和权限,所以拿到复制文件的人就需要把这个文件的拥有者的用户组修改一下。
  • 修改权限chmod

    • 权限的设置方法有两种等效的方法,数字法符号法

    • 数字法

      • 对于每种身份,【r】表示4,【w】表示2,【x】表示1,三种权限表示的数累加。则三种身份的权限应该可以使用一个三位数xyz表示
      1
      chmod [-R] xyz dirname/filename
      • 常常我们vim编辑一个shell脚本文件后,它的权限通常是-rw-rw-r–,也就是664,如果要将该文件改变成可执行文件,并且不让其他人修改此文件的话,那么就需要-rwxr-xr-x的权限,也就是775。此时就可以执行chmod 775 test.sh
    • 符号法

      1
      chmod 【对象】【操作】【权限】 dirname/filename
      • 【对象】包括:u(user),g(group),o(others),a(all)

      • 【操作】包括:+(增加),-(减少),=(指定)

      • 【权限】包括:r,w,x

      • 案例:

        1
        2
        3
        chmod u=rwx,go=rx .bashrc # 给user指定rwx权限,给group和others指定rx权限
        chmod a+w .bashrc # 无论最开始是否具有写权限,给所有人增加写权限
        chmod a-w .bashrc # 无论最开始是否具有写权限,去掉所有人的写权限
        • u=rwx,go=rx之间是没有空格的
        • +-状态下,只要是没有指定到的项目,权限都不会发生改变

5.1.4 理解文件和目录rwx权限的不同

  • 对一般文件来说,rwx主要是针对文件内容来设计权限;对目录来说,rwx则是针对目录内的文件名列表来设计权限。
  • 对文件来说,权限的意义是:
    • r:可读取此一文件的实际内容,如读取文本文件的文字内容等;
    • w:可以编辑、新增或是修改改文件的内容(但不含删除该文件);
    • x:该文件具有可以被系统执行的权限
  • 对目录来说,权限的意义是:
    • r:读取目录中的内容。只有具有r权限,才可以用ls命令将该目录的内容列表显示出来,按[tab]也才能自动补齐文件名。
    • w:修改目录中的内容,包括:建立新的文件或目录,改名、移动或删除已有的文件或目录。
    • x:访问该目录。只有具有x权限,用户才能进入该目录,cd命令才有效果。
  • 如果你在某目录下不具有x的权限,那么你就无法切换到该目录下,也就无法执行该目录下任何命令,即使你具有该目录的r或w权限。
  • 要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给。

5.1.5 文件的种类和扩展名

  • 文件种类【对应第一个字符】

    • 常规文件(regular file)【-】
      • 纯文本文件(ASCII)
      • 二进制文件(binary)
      • 数据文件(data)
    • 目录(directory)【d】
    • 链接文件(link)【l】
    • 设备与设备文件(device)
      • 区块(block)设备文件,如硬盘和软盘【b】
      • 字符(character)设备文件,如键盘鼠标【c】
    • 数据接口文件(sockets)【s】
    • 数据输送文件(FIFO, pipe)【p】
  • Linux文件扩展名

    • 一个Linux文件能不能被执行,只和是否具有x权限有关,和扩展名无关(不同于Windows)。当然,想要执行成功,还需要看文件的内容。
    • Linux系统上的文件名只是方便使用者了解文件可能的用途,比如.sh,.tar,.html。
  • Linux文件名长度

    • 在Linux下,使用传统的ext2、ext3、ext4文件系统以及近来被CentOS7当作默认文件系统的xfs而言,文件名长度的限制是
      • 单一文件或目录的最大容许文件名为255字节,以一个ASCII英文占用1个字节来算,则是255个字符;以一个汉字两个字节来算,则是128个汉字。
  • Linux文件名限制

    • 一般来说,为了避免系统误判,文件名最好避开下列特殊字符:

      1
      * ? > < ; & ! [ ] | \ ' " ` ( ) { }

5.2 目录配置

5.2.1 目录树(directory tree)

  • 在Linux下所有文件与目录都是由根目录开始的,然后再一个一个分支下去,这种目录配置方式就叫目录树。它主要的特性有
    • 目录树的起点为根目录(/, root);
    • 每一个目录不止能使用本地分区的文件系统,也可以使用网络上的文件系统。举例来说,可以利用Network File System(NFS)服务器挂载某特定目录等。
    • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

5.2.2 FHS标准

  • 根据Filesystem Hierarchy Standard(FHS)的官方文件指出, 它们的主要目的是希望让用户可以了解到已安装软件通常放置于哪个目录。重点在于规范每个特定的目录下应该要放置什么样的数据。

  • FHS根据文件系统使用的频繁与否以及是否允许用户随意修改,而将目录定义成四种交互作用的形态:

    • 可分享(sharable):可以分享给其他系统挂载使用的目录,所以包括可执行文件与使用者的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
    • 不可分享(unsharable):自己机器上面运行的设备文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了;
    • 不变(static):有些数据是不会经常变动的,跟随着发行版而不变动。 例如函数库、文件说明、系统管理员所管理的主机服务配置文件等;
    • 可变动(variable):经常修改的数据,例如日志文件、一般用户可自行收受的新闻组等。
    可分享(shareable) 不可分享(unshareable)
    不变(static) /usr(软件存放处) /etc(配置文件)
    /opt(第三方辅助软件) /boot(启动与内核文件)
    可变动(variable) /var/mail(用户邮箱) /var/run(程序相关)
    /var/spool/news(新闻组) /var/lock(程序相关)
  • FHS针对目录树架构仅定义出下面三层目录应该放置什么数据而已:

    • /(root,根目录):与启动系统有关
    • usr(unix software resource):与软件安装、执行有关
    • var(variable):与系统运行过程有关
  • 根目录/的意义和内容

    • 根目录和启动、还原、系统修复等操作有关。

    • FHS希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。

    • FHS 要求/下必须要存在的目录

      目录 应放置文件内容
      /bin 放置在单人维护模式下还能够被操作的命令
      /boot 这个目录主要在放置开机会使用到的文件,包括Linux内核文件以及启动选项与启动所需配置文件等等。
      /dev 在Linux系统上,任何设备与接口设备都是以文件的型态存在于这个目录当中的。
      /etc 系统主要的配置文件几乎都放置在这个目录内。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的, 但是只有root有权力修改。FHS建议不要放置可可执行文件(binary)在这个目录中。
      /lib 放置在开机时会用到的函数库, 以及在/bin或/sbin下面的命令会调用的函数库而已。
      /media 放置可移除的设备,比如CD。
      /mnt 暂时挂载某些额外的设备。
      /opt 放置第三方辅助软件放置。
      /run 系统开机后所产生的各项信息。
      /sbin 开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令。
      /srv “service”的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。
      /tmp 一般使用者或者是正在执行的程序暂时放置文件的地方。
      /usr 第二层 FHS 设置,后续介绍
      /var 第二层 FHS 设置,主要为放置变动性的数据,后续介绍
    • FHS 建议/下可以存在的目录

      目录 应放置文件内容
      /home 这是系统默认的使用者主文件夹(home directory)。
      /lib<qual> 用来存放与 /lib 不同的格式的二进制函数库,例如支持 64 位的 /lib64 函数库等
      /root 系统管理员(root)的主文件夹。
    • 早期 Linux 在设计的时候,若发生问题时,恢复模式通常仅挂载根目录而已,因此有五个重要的目录被要求一定要与根目录放置在一起, 那就是 /etc, /bin, /dev, /lib, /sbin 这五个目录。

  • /usr的意义和内容

    • usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据。

    • FHS 要求/usr下必须要存在的目录

      目录 应放置文件内容
      /usr/bin/ 存有所有一般用户能够使用的指令。CentOS 7里将全部的使用者指令放置于此,因此/bin只是/usr/bin的链接。另外,FHS 要求在此目录下不应该有子目录。
      /usr/lib/ 与/lib功能相同,所以/lib就是链接到此目录中的。
      /usr/local/ 系统管理员在本机自行安装自己下载的软件(非发行版默认提供者),建议安装到此目录, 这样会比较便于管理。
      /usr/sbin/ 非系统正常运行所需要的系统指令。不过基本功能与/sbin也差不多, 因此目前/sbin就是链接到此目录中的。
      /usr/share/ 主要放置只读架构的数据文件,当然也包括共享文件。在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文本文件。在此目录下常见的还有这些次目录:/usr/share/man:线上说明文档,/usr/share/doc:软件的说明文件,/usr/share/zoneinfo:与时区有关的时区文件。
    • FHS 建议/usr下可以存在的目录

      目录 应放置文件内容
      /usr/games/ 与游戏比较相关的数据放置处
      /usr/include/ c/c++等程序语言的文件开始(header)与包含档(include)放置处。
      /usr/libexec/ 某些**不被一般用户常用的可执行文件或脚本(script)**等等,都会放置在此目录中。
      /usr/lib<qual>/ 与 /lib<qual>/功能相同,因此目前 /lib<qual> 就是链接到此目录中
      /usr/src/ 一般源代码建议放置到这里。至于核心源代码则建议放置到/usr/src/linux/目录下。
  • /var的意义和内容

    • /var目录主要针对经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等。

    • FHS 要求/var下必须要存在的目录

      目录 应放置文件内容
      /var/cache/ 应用程序本身运行过程产生的一些缓存。
      /var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。
      /var/lock/ 一些需要上锁的文件资源。目前此目录也已经挪到 /run/lock 中!
      /var/log/ 放置日志文件,里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登陆信息)等。
      /var/mail/ 放置个人电子邮件信箱的。也被放置到/var/spool/mail/目录中。
      /var/run/ 放置某些程序或者是服务启动后的PID。这个目录链接到/run。
      /var/spool/ 放置一些队列数据,这些数据被使用后通常都会被删除。
  • 除了FHS之外,还有个Linux Standard Base(LSB)的标准是可以依循的。

5.2.3 绝对路径和相对路径

  • 根据文件名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative):
    • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如/home/dmtsai/.bashrc;
    • 相对路径:相对于目前路径的文件名写法。 例如…/home/dmtsai。
      • .:代表当前的目录,也可以使用./来表示;
      • .. :代表上一层目录,也可以../来代表。

二、习题解答(非官方,仅为个人练习记录)

  1. 早期的UNIX系统文件最多允许14个字符,而新的UNIX与Linux系统中,文件名最多可以使用几个字符?

    若使用ext2、ext3、ext4或xfs,255个英文字符或128个中文字符。

  2. 当一个一般文件权限为-rwxrwxrwx则表示这个文件的意义是什么?

    所有人都可以读、写和执行。

  3. 我需要将一个文件的权限改为-rwxr-xr–,请问该如何执行命令?

    1
    2
    chmod 754 filename
    chmod u=rwx,g=rx,o=r filename
  4. 若我需要更改一个文件的拥有者和用户组,该用什么命令?

    chownchgrp

  5. 请问下面的目录主要放置什么数据:/etc, /boot, /usr/bin, /bin, /usr/sbin, /sbin, /dev, /var, /log, /run

    • /etc:系统主要的配置文件。
    • /boot:开机会使用到的文件,包括Linux内核文件以及启动选项与启动所需配置文件等等。
    • /usr/bin, /bin:在单人维护模式下还能够被操作的命令。
    • /usr/sbin, /sbin:开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令。
    • /dev:设备与接口设备
    • /var:经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件
    • /log:日志文件
    • /run:系统开机后所产生的各项信息。
  6. 若一个文件的文件名开头为“ . ”,例如.bashrc这个文件,代表什么?另外,如何显示出这个文件名与他的相关属性?

    代表它是一个隐藏文件。使用ls -al命令。