Linux 文件

admin
admin 2019年10月17日
  • 在其它设备中阅读本文章

Linux 系统中所有内容都是以文件的形式保存和管理的,即 一切皆文件 ,目录是文件,硬件设备(键盘、监视器、硬盘)也是文件

一、文件类型

Linux 文件类型可分为以下七种

  • 普通文件 :Linux 中最多的一种文件类型, 包括:

    1. 纯文本文件(ASCII):是内容可以直接读到的数据,例如数字、字母等等。
    2. 二进制文件(binary):图片、音频、视频文件。
    3. 数据格式文件(data):程序在运行过程中,会读取特定格式的文件,这些文件可以称为数据文件(datafile)。
  • 目录文件 :目录文件包含了此目录中各个文件的文件名以及指向这些文件的指针,打开目录等同于打开目录文件。
  • 块设备文件 :以块为访问单位的设备, 主要存储数据以供系统存取,例如磁盘、光驱。
  • 字符设备文件 :以字符为访问单位的设备,串行端口的接口设备,例如键盘、鼠标。
  • 套接字文件(socket):套接字文件一般隐藏在 /var/run/ 目录下,用于进程间的网络通信
  • 管道文件(pipe):主要用于进程间通信,也称为 FIFO 文件(first-in-first-out)。
  • 链接文件(symbolic link):符号链接是指向系统上其他文件的引用,是指向另一文件的简介指针(也就是软链接)。

Linux 系统中的所有设备,要么是块设备文件,要么是字符设备文件。

windows 里通过扩展名来区分文件类型的,linux 里文件扩展名和文件类型没有关系。但为了容易区分和兼容用户使用 windows 的习惯,我们还是会用扩展名来表示文件类型。

  • .tar、.tar.gz、.tgz、.zip、.tar.bz 表示压缩文件。
  • .sh 表示 shell 脚本文件。
  • .pl 表示 perl 语言文件。
  • .py 表示 python 语言文件。
  • .html、.htm、.php、.jsp 表示网页语言的文件。
  • .conf 表示系统服务的配置文件。
  • .txt 表示文本文件。
  • ....

二、文件属主和属组

在 linux 系统中,对于一个文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。同时,用户是按组分类的,一个用户属于一个或多个组。因此,Linux 系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。

  • 创建文件的用户成为其属主,而这个用户所在的主组成为其属组
  • 应用创建的文件并不继承应用属主和属组,而是继承进程的所有者,谁启动这个程序,那么程序创建的文件的属主就是谁
  • 属主和属组没有关系,一个文件的属组不一定是属主所在的用户组,可以是任意的用户组
  • 文件的属主和属组只有一个
  • 属主实际记录的是其 uid,如果删除了用户,文件还存在,属主记录的还是 uid,只是用户不存在了
  • 本质上文件属于硬盘的,操作系统可以更改文件属主,这样你就“拥有”这个文件

三、文件权限

Linux 系统是一种典型的 多用户系统 ,不同的用户处于不同的地位,拥有不同的 权限 。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。将文件可存取访问的身份分为 3 个类别,分别是文件所有者(u)、用户组(g)、其他人(o),且 3 种身份各有(r)、(w)、 执行 (x)等权限。另外,可以对分区启用 访问控制列表 (ACL)来实现灵活的权限管理。

目录的权限有特殊的含义:

  • : 查询该目录下的文件名数据
  • : 新建、删除、重命名、转义
  • 执行 : 能否进入该目录

1、底层实现

权限由文件系统实现,不同的文件系统实现方法可能不一样,但本质是一样的。首先,权限的元数据放在 inode 中,严格地说是放在 inode table 中,因为每个块组的所有 inode 组成一个 inode table。在 inode table 中使用一列来存放数字型的权限,比如某文件的权限为 644。每次用户要对文件进行操作时系统都会先查看权限,确认该用户是否有对应的权限来执行操作。当然,inode table 一般都已经加载到内存中,所以每次查询权限的资源消耗是非常小的。
ext4.png
无论是读、写还是执行权限,所体现出来的能力究其本质都是因为它作用在对应文件的 data block 上。

2、默认权限和权限掩码 UMASK

一般来说,普通文件的默认权限是 644(没有执行权限),目录的默认权限是 755(必须有执行权限,否则进不去),链接文件的权限是 777。当然,默认文件的权限设置方法是可以通过 umask 值来改变的。
umask 值用于设置用户在创建文件时的默认权限。对于 root 用户 (实际上是 UID 小于 200 的 user),系统默认的 umask 值是 022;对于普通用户和系统用户,系统默认的 umask 值是 002。默认是写在 /etc/profile 和 /etc/bashrc 两个环境配置文件中。

umask 实质是减少新创建的文件权限

  • 如果创建的是目录,则使用 777-umask 值,如 root 的 umask=022,则 root 创建目录时该目录的默认权限为 777-022=755;
  • 如果创建的是普通文件,在 Linux 中,深入贯彻了一点:文件默认不应该有执行权限,否则是危险的。如果 umask 的三位都为偶数,则直接使用 666 去减掉 umask 值,因为 6 减去一个偶数还是偶数,任何位都不可能会有执行权限。如 root 创建普通文件时默认权限为 666-022=644,而普通用户创建普通文件时默认权限为 666-002=664;如果 umask 值某一位为奇数,则 666 减去 umask 值后再在奇数位上加 1。如 umask=021 时,创建文件时默认权限为 666-021=645,在奇数位上加 1,则为 646。

3、suid/sgid/sbit

suid:suid 只针对可执行文件,即二进制文件。它的作用是对某个命令 (可执行文件) 授予所有者的权限,命令执行完成权限就消失。一般是提权为 root 权限。
suid 必须和 x 配合,如果没有 x 配合,则该 suid 是空 suid,仍然没有执行命令的权限,所有者都没有了 x 权限,suid 依赖于它所以更不可能有 x 权限。空的 suid 权限使用大写的”S”表示。
数字 4 代表 suid,如 4755。

sgid:针对二进制文件和目录。
针对二进制文件时,权限升级为命令的所属组权限。
针对目录时,目录中所建立的文件或子目录的组将继承默认父目录组,其本质还是提升为目录所属组的权限。此时目录应该要有 rx 权限,普通用户才能进入目录,如果普通用户有 w 权限,新建的文件和目录则以父目录组为默认组。
数字 2 代表 sgid,如 2755,和 suid 组合如 6755。

sbit:只对目录有效。对目录设置 sbit,将使得目录里的文件只有所有者能删除,即使其他用户在此目录上有 rwx 权限,即使是 root 用户。
数字 1 代表 sbit。

suid/sgid/sbit 的标志位都作用在 x 位,当原来的 x 位有 x 权限时,这些权限位则为 s /s/t,如果没有 x 权限,则变为 S /S/T。例如,/tmp 目录的权限有个 t 位,使得该目录里的文件只有其所有者本身能删除。

四、查看文件

1、ls 命令查看文件信息

用法:ls [选项]... [文件]...
选项:

  • -a 显示所有文件及目录 (ls 内定将文件名或目录名称开头为 "." 的视为隐藏档,不会列出)
  • -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
  • -R 若目录下有文件,则以下之文件亦皆依序列出
$ ls -l /dev
total 64
lrwxrwxrwx  1 root root                  15   Dec 17 09:55 android -> bus/usb/001/004
crw-r--r--       1 root root       10,   235    Apr 17 09:55 autofs
drwxr-xr-x    2 root root                160   Dec 17 17:55 block

……

第一个字段表示文件类型和文件权限 ,固定十个字符,含义如下:
文件属性.png

  • 第 0 位表示文件类型,有字符 [-] 普通文件、[d]目录、[b]块设备、[c]字符设备、[s]套接字、[p]管道、[l]链接
  • 第 1 - 3 位表示属主拥有该文件的权限
  • 第 4 - 6 位表示属组拥有该文件的权限
  • 第 7 - 9 位表示其他用户拥有该文件的权限
  • 第 1、4、7 位表示读权限,用 [r] 字符表示
  • 第 2、5、8 位表示写权限,用 [w] 字符表示
  • 第 3、6、9 位表示可执行权限,用 [x] 字符表示
  • 如果没有权限则用 [-] 字符表示

第二个字段表示文件数量 ,如果是文件,则数目是 1,如果是目录,则是该目录中的文件个数。

第三个字段表示该文件的属主

第四个字段表示该文件的属组

第五个字段表示该文件的大小 ,如果是设备文件,则是以逗号隔开的两个数字,分别表示主设备号和次设备号

第六七八个字段表示该文件的创建日期 ,以“月,日,时间”的格式表示

第九个字段表示表示文件名 ,可以用[–a] 选项显示以 [.] 开头的隐藏文件。

2、cat 命令查看文件内容

cat 用于连接所有指定文件并将结果写到标准输出,一般用来查看文本文件内容。
用法:cat [选项]... [文件]...
选项:

  • -n 或 --number:由 1 开始对所有输出的行数编号。
  • -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
  • -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
$ cat /etc/hostname 
kdkj3-pc

cat 可以指定多个文件

3、chgrp 命令更改文件属组

用法:chgrp [选项] 属组名 文件名
选项:

  • -R:递归更改,在更改某个目录文件的属组时,同时该目录下的所有文件的属组都会更改。
chgrp -R root /root

4、chown 命令更改文件属主,也可以同时更改文件属组

用法:chown [选项] 属主名 [: 属组名] 文件名
选项:

  • -R:递归更改,在更改某个目录文件的属组时,也会更改该目录下的所有文件。
chown -R root:root /root

5、chmod 命令更改文件权限

用法:chmod [选项] mode 文件名
选项:

  • -R:递归更改,在更改某个目录文件的权限时,同时该目录下的所有文件的属组都会更改。

mode: 权限设定字串,格式如下 :

[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同组者,o 表示其他以外的人,a 表示这三者皆是。
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

mode 也可以用数字来表示权限如,用法为chmod abc file,其中 a,b,c 各为一个数字,分别表示 User、Group、及 Other 的权限。
其中 r =4,w=2,x=1。

chmod ugo+r file1.txt
chmod a-x file1.txt
chmod a=rwx file
chmod 777 file