40、Linux 文件、目录和链接管理全解析

Linux 文件、目录和链接管理全解析

1. 引言

在 Linux 环境中,文件通常被认为是存储在诸如磁碟或固态硬碟等存储介质上的数据载体。不过,文件也能存储在虚拟文件系统等易失性介质中。接下来,我们将深入探讨文件的特性、数据元结构等内容。

2. 准备工作

为了后续的实验,我们需要在 ~/Documents 目录下创建一些文件和一个新用户。
- 创建文件 :以 student 用户身份,将当前工作目录切换到 ~/Documents ,执行以下命令:

[student@studentvm1 Documents]$ for X in `seq -w 20`;do echo "Hello world" file$X > testfile$X ; touch test$X file$X ; done

该命令中, seq 工具用于生成从 0 到 20 的数字序列, -w 选项确保所有数字长度相同。
- 查看文件列表 :使用 ll -h 命令以人类可读的格式查看文件列表和大小:

[student@studentvm1 Documents]$ ll -h
total 880K
-rw-rw-r-- 1 student student   0 Dec  4 09:47 file01
-rw-rw-r-- 1 student student   0 Dec  4 09:47 file02
...
  • 创建新用户 :以 root 用户身份登录终端,添加新用户 student1 并设置密码:
[root@studentvm1 ~]# useradd -c "Student user 1" student1
[root@studentvm1 ~]# passwd student1
Changing password for user student1.
New password: <Enter the password>
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: <Enter the password again>
passwd: all authentication tokens updated successfully.
3. 用户账户与安全

用户账户是 Linux 计算机安全的第一道防线,用于控制对计算机的访问,防止未经授权的人员进入,并避免合法用户相互干扰数据和使用计算机。文件的权限和所有权属性是 Linux 提供的安全机制之一,每个文件和目录都有所有者和一组访问权限,正确设置所有权和权限可确保用户只能访问自己的文件。

4. 文件属性
4.1 文件所有权

每个文件都有两个所有者:用户所有者和组所有者。文件创建者通常是文件的所有者,在基于 Red Hat 的发行版中,每个用户都有自己的私有组,他们创建的文件也属于该组,这有助于提高安全性。而在一些旧的 Unix 和 Linux 系统中,所有用户及其创建的文件都属于一个公共组,这在数据安全和隐私方面存在一定风险。

root 用户可以随时更改文件的用户和组所有权,文件的用户所有者在特定情况下可以更改组所有权。添加用户和组时,建议选择从 5000 及以上的组 ID 号。

以下是一个关于文件所有权的实验:
- 查看文件所有权 :以 student 用户身份查看 ~/Documents 目录下的 file09 文件所有权:

[student@studentvm1 Documents]$ ll file09
-rw-r--r-- 1 student student 0 Feb  9 16:17 file09
  • 尝试更改用户所有权 :使用 chown 命令尝试将文件所有权更改为 student1
[student@studentvm1 Documents]$ chown student1 file09
chown: changing ownership of 'file09': Operation not permitted
  • 尝试更改组所有权 :使用 chgrp 命令尝试更改组所有权:
[student@studentvm1 Documents]$ chgrp student1 file09
chgrp: changing group of 'file09': Operation not permitted

可以看到,普通用户无法更改文件的用户和组所有权,这是一种安全特性。若要共享文件,可以将文件复制到 /tmp 目录。

以下是共享文件的实验步骤:
- 添加数据到文件 :以 student 用户身份向 file09 文件添加数据:

[student@studentvm1 Documents]$ echo "Hello world." > file09
[student@studentvm1 Documents]$ cat file09
Hello world.
  • 复制文件到 /tmp 目录
[student@studentvm1 Documents]$ cp file09 /tmp
  • 切换用户查看文件 :使用 su 命令切换到 student1 用户,查看并复制 /tmp 目录下的文件:
[student@studentvm1 ~]$ su - student1
Password: <Enter password for student1>
[student1@studentvm1 ~]$ cat /tmp/file09
Hello world.
[student1@studentvm1 ~]$ cp /tmp/file09 . ; cat file09
Hello world.
5. 文件权限

文件权限分为用户(User)、组(Group)和其他(Other)三类,每类有读(Read)、写(Write)和执行(Execute)三种权限,分别用 r w x 表示,对应的八进制值分别为 4、2、1。

权限 含义 八进制值
r 可读 4
w 可写 2
x 可执行 1

以下是一个关于文件权限的实验:
- 更改文件权限 :以 student 用户身份将 /tmp/file09 文件的权限更改为 rw-rw----

[student@studentvm1 ~]$ cd /tmp ; ll file*
-rw-rw-r-- 1 student student 13 Feb 10 09:26 file09
[student@studentvm1 tmp]$ chmod 660 file09 ; ll file*
-rw-rw---- 1 student student 13 Feb 10 09:26 file09
  • 尝试读取文件 :以 student1 用户身份尝试读取该文件:
[student1@studentvm1 ~]$ cat /tmp/file09
cat: /tmp/file09: Permission denied
6. 目录权限

目录权限与文件权限类似:
- 读权限:允许列出目录内容。
- 写权限:允许在目录中创建、更改和删除文件。
- 执行权限:允许将该目录设置为当前工作目录。

此外,还有两个特殊的权限位: setgid setuid ,通常对非 root 用户不可见。

7. 组所有权的影响

组所有权可以帮助用户在部分用户之间共享文件。组在 /etc/group 文件中定义,通过将文件的组所有权设置为特定组,该组的成员可以根据组权限访问文件。

以下是一个关于组所有权的实验:

graph TD;
    A[root创建新用户student2] --> B[root添加新组dev];
    B --> C[root将student和student1添加到dev组];
    C --> D[root创建共享目录/home/dev并设置权限];
    D --> E[student进入/home/dev目录];
    E --> F[student创建文件并设置权限];
    F --> G[student1进入/home/dev目录并修改文件];
    G --> H[root设置/home/dev目录的setgid位];
  • 创建新用户和组 :以 root 用户身份创建新用户 student2 和组 dev ,并将 student student1 添加到 dev 组:
[root@studentvm1 ~]# useradd -c "Student User 2" student2
[root@studentvm1 ~]# passwd student2
[root@studentvm1 ~]# groupadd -g 5000 dev
[root@studentvm1 ~]# usermod -G 5000 student
[root@studentvm1 ~]# usermod -G 5000 student1
  • 查看 /etc/group 文件
[root@studentvm1 ~]# tail /etc/group
vboxsf:x:981:
dnsmasq:x:980:
tcpdump:x:72:
student:x:1000:
screen:x:84:
systemd-timesync:x:979:
dictd:x:978:
student1:x:1001:
student2:x:1002:
dev:x:5000:student,student1
  • 创建共享目录并设置权限 :以 root 用户身份创建共享目录 /home/dev ,设置组所有权为 dev ,权限为 770
[root@studentvm1 ~]# cd /home ; mkdir dev ; ll
[root@studentvm1 home]# chgrp dev dev ; chmod 770 dev ; ll
  • 学生用户操作 :以 student 用户身份进入 /home/dev 目录,创建文件并设置权限:
[student@studentvm1 ~]$ cd /home/dev ; ll -a
[student@studentvm1 dev]$ echo "Hello World" > file01 ; ll
[student@studentvm1 dev]$ chgrp dev file01
[student@studentvm1 dev]$ chmod 660 file01 ; ll
  • 切换用户操作 :以 student1 用户身份进入 /home/dev 目录,向文件中添加内容:
[student1@studentvm1 ~]$ cd ../dev ; echo "Hello to you, too" >> file01 ; cat file01
  • 设置 setgid :以 root 用户身份设置 /home/dev 目录的 setgid 位:
[root@studentvm1 home]# chmod g+s dev ; ll

通过以上实验,我们可以看到如何在 Linux 系统中管理文件、目录的所有权和权限,以及如何利用组所有权实现文件共享。

Linux 文件、目录和链接管理全解析

8. 文件共享的进一步优化

在前面的实验中,我们已经实现了文件在特定用户组内的共享。然而,还可以通过设置 setgid 位进一步优化文件共享过程。当在目录上设置 setgid 位后,在该目录下创建的新文件将自动继承该目录的组所有权。

下面详细介绍操作步骤:
1. 确认目录当前权限

[root@studentvm1 home]# ll dev
drwxrwx--- 2 root dev 4096 Feb 10 13:42 dev
  1. 设置 setgid
[root@studentvm1 home]# chmod g+s dev
[root@studentvm1 home]# ll dev
drwxrws--- 2 root dev 4096 Dec  9 13:09 dev

可以看到,目录的组权限部分出现了小写的 s ,表示 setgid 位和执行位都已开启。

  1. 验证 setgid 效果 :以 student 用户身份在 /home/dev 目录下创建新文件:
[student@studentvm1 dev]$ echo "New shared file" > newfile
[student@studentvm1 dev]$ ll newfile
-rw-r--r-- 1 student dev 15 Feb 11 10:30 newfile

可以发现,新创建的文件 newfile 的组所有权为 dev ,这表明 setgid 位生效,新文件自动继承了目录的组所有权。

9. 文件权限的符号表示法和八进制表示法

在前面的实验中,我们使用了八进制表示法来设置文件和目录的权限,如 chmod 660 file01 。此外,还可以使用符号表示法来更灵活地设置权限。

符号 含义
u 用户(User)
g 组(Group)
o 其他(Other)
a 所有(All,即 u + g + o
+ 添加权限
- 移除权限
= 设置权限

以下是一些符号表示法的示例:
- 添加用户的执行权限

[student@studentvm1 dev]$ chmod u+x file01
[student@studentvm1 dev]$ ll file01
-rwxrw---- 1 student dev 12 Feb 11 09:26 file01
  • 移除组的写权限
[student@studentvm1 dev]$ chmod g-w file01
[student@studentvm1 dev]$ ll file01
-rwxr---- 1 student dev 12 Feb 11 09:26 file01
  • 设置其他用户的读权限
[student@studentvm1 dev]$ chmod o=r file01
[student@studentvm1 dev]$ ll file01
-rwxr--r-- 1 student dev 12 Feb 11 09:26 file01
10. 硬链接和软链接

在 Linux 系统中,链接是一种特殊的文件,它可以指向另一个文件或目录。链接分为硬链接和软链接两种类型。

10.1 硬链接

硬链接是文件的另一个名称,它与原始文件共享相同的 inode(索引节点)。这意味着硬链接和原始文件实际上指向同一个物理数据块。

创建硬链接的命令是 ln ,以下是一个示例:

[student@studentvm1 dev]$ ln file01 file01_hardlink
[student@studentvm1 dev]$ ll file01 file01_hardlink
-rwxr--r-- 2 student dev 12 Feb 11 09:26 file01
-rwxr--r-- 2 student dev 12 Feb 11 09:26 file01_hardlink

可以看到,硬链接 file01_hardlink 和原始文件 file01 的权限、大小和修改时间都相同,并且链接数变为 2。

硬链接的特点:
- 硬链接只能指向同一文件系统中的文件。
- 删除原始文件不会影响硬链接,因为它们共享相同的 inode。
- 硬链接不能指向目录。

10.2 软链接

软链接也称为符号链接,它是一个特殊的文件,包含指向另一个文件或目录的路径。软链接有自己独立的 inode,它只是指向目标文件的一个指针。

创建软链接的命令是 ln -s ,以下是一个示例:

[student@studentvm1 dev]$ ln -s file01 file01_softlink
[student@studentvm1 dev]$ ll file01 file01_softlink
-rwxr--r-- 2 student dev 12 Feb 11 09:26 file01
lrwxrwxrwx 1 student dev  6 Feb 11 10:45 file01_softlink -> file01

可以看到,软链接 file01_softlink 前面有一个 l 表示它是一个符号链接,并且显示了它指向的目标文件。

软链接的特点:
- 软链接可以指向不同文件系统中的文件或目录。
- 删除原始文件后,软链接将成为一个无效链接。
- 软链接可以指向目录。

11. 文件时间戳

每个 Linux 文件都有三个重要的时间戳:
- 访问时间(atime) :文件最后一次被访问的时间。
- 修改时间(mtime) :文件内容最后一次被修改的时间。
- 状态改变时间(ctime) :文件的元数据(如权限、所有权等)最后一次被改变的时间。

可以使用 stat 命令查看文件的时间戳信息:

[student@studentvm1 dev]$ stat file01
  File: file01
  Size: 12          Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 123456      Links: 2
Access: (0744/-rwxr--r--)  Uid: ( 1000/  student)   Gid: ( 5000/      dev)
Access: 2024-02-11 10:30:00.000000000 +0800
Modify: 2024-02-11 09:26:00.000000000 +0800
Change: 2024-02-11 10:30:00.000000000 +0800
 Birth: -

也可以使用 touch 命令来修改文件的时间戳:
- 更新访问时间和修改时间为当前时间

[student@studentvm1 dev]$ touch file01
  • 指定访问时间和修改时间
[student@studentvm1 dev]$ touch -a -t 202402101200 file01  # 设置访问时间为 2024-02-10 12:00
[student@studentvm1 dev]$ touch -m -t 202402101300 file01  # 设置修改时间为 2024-02-10 13:00
12. 总结

通过以上一系列的实验和操作,我们全面了解了 Linux 系统中文件、目录和链接的管理方法。包括文件和目录的所有权、权限设置,利用组所有权实现文件共享,以及硬链接和软链接的使用等。同时,我们还学习了文件时间戳的相关知识。

在实际应用中,合理设置文件和目录的权限和所有权可以有效保护系统的安全性和数据的隐私性。利用组所有权和链接可以方便地实现文件的共享和管理。掌握这些知识将有助于我们更好地管理和维护 Linux 系统。

graph LR;
    A[文件所有权] --> B[用户和组所有权设置];
    B --> C[权限管理];
    C --> D[文件共享];
    D --> E[setgid位优化];
    C --> F[符号和八进制表示法];
    C --> G[硬链接和软链接];
    C --> H[文件时间戳];

这个流程图总结了我们在 Linux 文件、目录和链接管理中所涉及的主要知识点及其相互关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值