Linux学习笔记1 文件、文件权限与目录结构以及操作

虽然从树莓派开始,接触linux已经有挺长一段时间了,但是一直没有深入、系统的学习一下,最近看屏幕多了眼睛都有一定的损伤,那还是减少看屏幕的时间,有空的话看看书吧,很久之前买过鸟叔的linux私房菜,不过当时没看多少就放着吃灰了,现在可以拿起来继续看了。

Linux文件/目录的权限

权限之于文件

对于文件的三种角色:

  1. 文件拥有者
  2. 群组
  3. 群组外人士

输入ls -l查看文件列表之后可以看到类似于下面这些属性:

drwxr-xr-x 14 root root 4096 9月 1 22:59 dev

第一个字符代表的是文件种类,有下面几种类型

  • d 目录
  • - 表示普通文件

    要继续细分的话可以大略分成:

    1. 纯文本(ascii)文件,可以直接读出
    2. 二进制文件
    3. 数据格式文件 某些程序运行中会产生/读取的特殊格式的文件,直接读可能只看得到乱码
  • l 表示为链接文件
  • 设备文件

    1. b 表示为块设备(如各种储存设备
    2. c 表示为字符设备,如鼠标键盘等
  • s 表示为socket(数据接口)文件 通过socket来进行数据的沟通与操作
  • p管道文件(FIFO pipe)
字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。 相反,此类设备支持按字节/字符来读写数据。 举例来说,键盘、调制解调器是典型的字符设备。 (2) 块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置

接下来是三个一组的三组字符串rwx分别代表可读(4),可写(2),可执行(1) 可执行用于标识一个文件是可执行文件,当然是否真的可以执行那就是另外一回事了,三组分别代表文件的拥有者,所属群组以及无关人士的操作权限。这里的权限仅是针对与文件来说的,对于目录,这几个字母的意义则有些不同。第二栏的数字(14)则代表有多少文件名链接到此inode节点。三四栏则代表文件的拥有者以及所属群组。然后是文件的大小(默认字节),以及创建/修改日期(mtime)

权限之于目录

rwx三个权限对于目录来说意义是不同的。

  • r 读取目录结构

    可以读取目录的结构,如一个目录下有哪些文件,有这个权限可以使用ls dir查看一个目录下有哪些文件,后面我们可以知道,目录“文件”中记录了位于目录中的其他文件的名字——inode对应关系,所以查看文件列表也算是“读”了目录。

  • x 进入目录

    x权限代表有权进入目录,并使之称为工作目录,当我们想要运行目录下的程序,或者是读取目录下的文件中的信息时,需要有这个权限(而不是r权限),所以要开放目录,rw权限都是要给的。

  • w 目录修改权限

    这个目录给的权限相当的打,因为有了这个权限就可以修改目录“文件”,也就是说可以编辑目录的文件内容,可以删除其中的文件,也可以修改文件命名(因为目录文件的内容就是文件名和inode的对应关系),所以千万不要随便使用chmod 777 或者chmod 733 ,这都是相当危险的(即使没办法查看文件列表,但是也可以根据文件名进行删除等操作)。

操作权限的指令

  • chgrp 修改文件所属群组

    chgrp group1 file

  • chown 改变拥有者

    chown sailor file

    chown user:group file 也是可以的,也可以 :group

  • chmod 修改文件权限,包含SUID SGID SBIT等特性

    chmod 755 file

    还可以和符号结合的方式改变权限,如:

    chmod u+r 给拥有者增加读取权限

    符号有:

    • +
    • -

      a-x

    • =

      u=rwx, go=rx

对象有:

  • u 拥有者
  • g 群组
  • o 其他人
  • a 所有人

Linux 文件与目录默认权限以及隐藏权限

文件默认权限

文件和目录的权限由默认权限拿去掩码指定的权限而确定

对于文件 默认权限是 666

对于目录则是 777

我们创建一个文件时的默认权限和umask相关,使用下列指令查看

[email protected]:~# umask
0022
[email protected]:~# umask -S
u=rwx,g=rx,o=rx

不过我们还能注意到一点,这里的掩码有四个数字,说明有四组权限!umask作为掩码使用,指的是相关权限组需要减去的权限,如0022 指的是group 和 others 都要减去w权限才行(不要直接减去数字,再转为权限,还是有差别的)。多人合作的情形下,在一个目录中可以把umask设置成002,这样新建的文件,同一个分组下的其他用户也可以编辑了。

文件隐藏属性

除了基本的rwx权限外,在ext文件系统下还有一些特殊的权限,使用chattr修改lsattr查看,隐藏属性甚至可以让文件的拥有者都无法修改文件(当然root还是可以的)。

chattr +/-/= 属性名 文件名来设置

  • A 存取A属性的文件时,atime不会被修改
  • S S属性的文件被修改时会同步写入磁盘
  • a 只能增加内容不能删除或者修改 root才能设置
  • d 不会被dump备份
  • i 使得一个文件不能被删除、改名、设置链接、写入或者新增数据
  • s 如果文件被删除,会被彻底移出磁盘空间
  • u 被删除后还会被保留在磁盘中,还可以救援

文件特殊权限

上面umask出现的第一个0对应的第一组权限,就是文件的特殊权限啦。包含三个权限 SUID SGID SBIT。 因此完整显示的权限应该是 -rwxs rwxs rwxt 实际上是 rws rws rwt ?为什么?因为隐含意义就含有了x权限,以SUID为例,如果执行过程中拥有拥有者的权限,那么拥有者也是有x权限的,不然怎么执行呢?

s s t 分别对应 4 2 1

  1. SUID (Set UID)

    • SUID仅作用于二进制程序
    • 执行者对于该文件要有x权限
    • 仅在执行过程中有效
    • 执行过程中执行者将拥有程序拥有者的权限

例子就是,/etc/shadow文件记录了用户和密码相关信息,但是他的文件权限是000,拥有者是root,按理说除了root之外任何人都不能修改该文件,但是我们依旧可以使用passwd来修改密码,因为passwd指令 -rwsr-xr-x 1 root root 68208 5月 28 14:37 /usr/bin/passwd 就拥有这个s权限,所以我们执行passwd时用户也临时拥有了root的权限。

  1. SGID(Set GID) 两种情况

    SGID作用在二进制文件上时:

    • 执行者需要具有x权限
    • 作用:执行者在执行过程中会获得该程序所在群组的权限 类似于SUID

作用在目录上时:

  • 使用者若具有目录的r和x权限,即能进入目录
  • 使用者在目录下的群组便会变成该目录的群组
  • 如果使用者在目录下具有了w权限,新建的新文件所属群组与该目录群组相同
  1. Sticky Bit

    仅对目录有效

    • 使用者具有目录的w,x权限时,即可以写入目录时
    • 使用者在该目录下创建的文件或者目录只有本人和root可以删除,如/tmp目录 权限为 rwxrwxrwt,虽然所有人都能创建文件/目录,但是普通用户不能删除别人的文件。

对于隐藏权限的设置,可以使用chmod 4755 这样的形式。 也可以是 SUID: u+s SGID: g+s SBIT o+t.

文件的三种时间属性

  1. mtime

    文件的内容发生变更时(不是属性和权限),mtime会被更新

  2. ctime (status time)

    文件的状态(权限和属性)改变时,这个时间会更新

  3. atime

    文件内容被读取时会更新

touch指令可以修改文件的几个时间属性

-a 修改atime -m 修改mtime -d 指定日期

对文件与目录的操作

常用的几条操作目录的指令都很简单

  1. cd 变换目录
  2. pwd 显示当前目录
  3. mkdir 创建目录

    可以使用参数 -m 755 这样的形式来指定创建的目录的权限,默认的权限的话则取决于umask -p可以递归创建

  4. rmdir 删除空目录

    -p 递归删除目录

我们能够直接输入指令而不需要输入程序的绝对路径是因为存在名为$PATH的环境变量,系统会在PATH变量中的目录下查询可执行文件,我们也可以添加目录export PATH=$PATH:/xxx/xxx。不同的用户的默认PATH可能是不同的,如root和普通用户,所以能够执行的指令也不同。

文件和目录管理指令

  1. ls
  2. cp 复制

    有一些比较有意思的参数

    • -d 如果文件是链接文件,复制链接文件属性而不是文件本身,即保留链接,不然普通的复制只复制了文件而链接失效了。
    • -f 如果目标文件存在且已经打开,移除后再次复制
    • -i 如果目标文件存在,先询问是否替换
    • -l 创建链接文件(hard link)
    • -r 递归
    • -s 复制成符号链接文件
    • -u 如果目标文件比源文件旧才更新
  3. rm

    喜闻乐见的rm -rf...

    • -f 强制删除,不警告
    • -i 互动模式
    • -r 递归删除

如果文件名字首字符是 - 那么可以加上./-file 来指明是文件。

  1. mv

    • -f 强制,如果文件存在,直接覆盖
    • -i 互动模式
    • -u 比较是否更新,保留新的文件
  2. basename和dirname 分别获取最后的文件名与目录名

查阅文件内容的相关指令:

  1. cat 由第一行开始显示文件内容

    -v 列出看不到的特殊字符

  2. tac 从最后一行开始显示
  3. nl 显示并输出行号
  4. more 一页一页显示
  5. less 类似more 但是可以向前翻页
  6. head只看头几行
  7. tail 只看尾巴几行
  8. od 以二进制形式读取文件

读取一个文件的11~20行

head -n 20 file | tail -n 10

Linux的文件搜寻

当我们想要知道一个程序/文件在什么地方的时候就可以使用搜寻指令了。有下列几种指令

  1. which 寻找可执行文件

    寻找一条命令对应的可执行文件在什么地方,-a找出所有匹配的程序,而不是第一个,无法寻找bash内置的指令,只能找PATH内的。

  2. whereis 只寻找特定目录下的文件
  3. locate 从数据库搜寻文件名 一段时间会自动更新一次,也可以使用updatedb手动更新(话说我debian10都没装locate)
  4. find 直接前往文件系统中查找文件,可以设置时间范围,文件大小范围,文件类型,文件名等约束条件。

Linux 目录规范

Linux有很多的发行版,他们可能在细节上有着很多差异,但是在配置文件、目录的安排上又有着相似甚至相同的地方,因为有一套标准作为依据,如FHS标准。FHS注要规范了下面的三个目录

  • / 根目录
  • /usr (不是user二十unix software resource) 与软件安装运行相关
  • /var(variable) 与系统的运行相关

根目录

根目录与系统的开机与运行相关,尽量不要放在大分区内,减少数据写入,避免发生错误。FHS定义根目录下最好要有下面这些子目录存在:

  1. /bin 用来防止担任维护模式可执行的指令(基本指令)
  2. /boot 与开机相关的文件,如核心文件以及grub2开机管理程序
  3. /dev 设备与周边设备都以文件的形式存在于这个目录中,还有一些特殊的设备文件 如: /dev/null /dev/zero
  4. /etc 系统中的配置文件
  5. /lib 系统的函数库文件,开机时用到的函数库 /lib/modules 可以切换的核心相关模块 如驱动
  6. /media 软盘 光盘 dvd等
  7. /mnt 临时将外部设备挂载到这
  8. /opt 第三方软件 如kde等可以装到这 /usr/local 下也可以
  9. /run 开机后产生的信息放置到这
  10. /sbin 放置开机过程中需要的文件
  11. /srv 一些服务使用的文件,如web服务器文件会放在/srv/www下(centos是放在者的)
  12. /tmp 临时文件可以放着,一段时间后可能会被清理掉
  13. /usr 后续详细介绍
  14. /var 后续介绍,主要放置变动频繁的文件
  15. /home 使用者的主文件夹,里面包含了以普通用户用户名命名的文件夹,作为其主文件夹 ~sailor
  16. /lib64 /lib32 与/lib不同格式的库文件
  17. /root 管理员的主文件夹,没有放在/home下是为了在单人维护模式,仅挂载根目录时也可以进入。

另外还有几个文件,虽然FHS没有规范,但是也比较特殊

  1. /lost+found ext文件系统产生的目录,在文件系统发生错误时,放置遗失的片段
  2. /proc 这个目录的数据都位于内存中,包含了系统的信息以及状态。 /proc/cpuinfo
  3. /sys 也是虚拟文件系统,记录和核心 系统硬件相关的信息。

usr的内容

usr中的数据应该是可分享,不可变动的文件(程序)

  1. /usr/local 自己下载的软件(不是包管理器安装),可以放到这
  2. /usr/sbin 非运行时必要的系统指令可以放到这
  3. /usr/share 主要放置只读的数据文件 如说明文档,时区文件等
  4. /usr/include 放置c/cpp等语言的头文件和包含文件等
  5. /usr/src 源码可以放这

var的内容

usr在安装后会占用较大的内容,而var的容量则是随着系统运行而增长的,注要用于存放变动频繁的文件,如日志,缓存,软件运行生成的文件等。

  1. /var/cache 程序运行时使用多个缓存
  2. /var/lib 程序运行时用到的数据文件可以放这,不同的软件有他们自己的目录,如mysql的数据库放在/var/lib/mysql中。
  3. /var/lock 记录上锁操作的文件。
  4. /var/log 日志文件
  5. /var/run 程序运行后PID会被放置在该目录下。

详细到不同的发行版中,目录的安排还是会有一些区别,不过大致方向是没有错的。