在前一章中,我们通过导航文件系统向您介绍了 Linux 文件和文件夹。在本章中,我们将学习如何使用、查找和更改读取和编辑文件的权限和访问权限。我们将扩展这个主题的知识,定义什么是文件系统,并向您展示处理文件的重要命令,例如复制和移动。
我们将向您介绍以下概念:
- 理解文件系统
- 使用文件链接
- 搜索文件
- 与用户和组一起工作
- 使用文件权限
- 使用文本文件
- 使用 VIM 文本编辑器
文件系统不仅是展示给 Linux 用户的文件和文件夹的树,也是访问和保存数据以及保持一切一致的结构和管理。如前所述,你经常听到这样一句话,在 Linux 中,一切都是一个文件,这是真的。这意味着 Linux 中很多不同的东西被抽象为文件。例如,一个目录是一个文件,硬件设备得到的表示是特殊的系统文件,或者,有用的,比如随机数发生器,也是一个文件。
让我们快速回顾并总结一下上两章中我们已经知道的关于使用文件的知识。ls
列出并显示文件,touch
创建一个文件,文件区分大小写,.
文件是隐藏文件,被排除在正常命令执行之外,如ls
命令,也不包括使用文件 globbing 字符的 shell 扩展。接下来,你应该也已经知道mkdir
创建目录,rmdir
删除空目录,rm
删除文件,mkdir -p
创建全子目录结构。rmdir
不能应用于非空目录;在我们的例子中,它包含子文件夹。rm -rf
删除一个包含所有子目录的目录,但是要小心处理。当使用rm -rf
选项删除整个目录结构时,r
选项代表递归,f
代表强制。递归选项是一个重要的选项,当您使用为整个子目录树做一些事情的命令时,经常会遇到这个选项。
现在,让我们学习一些其他重要的新的基于文件的命令。如果需要复制文件,可以使用cp
命令。我们在上一章已经看到了cp
的一般用法。如果转到cp
命令的手册页,有三种不同的使用格式:cp [option]... [-T] SOURCE DEST
、cp [option]... SOURCE... DIRECTORY
和cp [option]... -t DIRECTORY SOURCE...
一定要记住,可以有多个源目录,但只能有一个目标目录。你必须记住这个。要将一个文件复制到一个目标文件,可以使用第一种用法。要将多个文件复制到一个目标文件夹,可以使用第二种用法。第三种使用形式类似于第二种使用形式,但是混合了源和目录参数。
例如,要创建不同文件名的文件副本,请使用cp firstfile secondfile
;您也可以使用本地路径名进行同样的操作。我们从手册中了解到,您也可以将文件复制到保留原始文件名的目录中。如手册所示,您也可以对多个源文件执行此操作。请注意,您不能使用cp
命令将完整的目录从盒子中复制出来。为此,您需要提供-R
选项:
可以看到,完整的olip
主目录已经复制到/tmp
目录下,包含所有子目录和文件。请记住cp -R
选项再次代表递归。要在命令行上移动文件和文件夹,可以使用 move 命令,该命令隐式复制和删除源文件。移动命令mv
常用于重命名文件和文件夹。请注意,您不仅可以移动或重命名文件,还可以移动或重命名文件夹。
现在,如果你再看一下ls -l
选项,例如在/etc
目录中,你会注意到一些事情。你会得到很多有用的信息。这里的-l
列表中的第一个字符是d
,或-
,或l
,这代表文件的类型。A d
代表目录,a -
是普通文件,l
是链接。ls -l
输出中的第一个字符也称为文件类型标志。除了所示的d
、-
和l
标志外,还有许多其他可用的文件类型。要获得所有可用文件类型标志的完整列表,请使用man find
,搜索type
,然后搜索type c
。您将获得 Linux 中所有可用文件类型标志的完整列表:
此外,在权限列旁边的列中给出了另一条非常有用的信息。显示的数字是文件包含的链接数:
文件链接告诉我们在任何给定的文件或目录中有多少引用。默认情况下,每个普通文件都有一个链接,每个目录都有两个链接。有硬链接和软链接,我们稍后将讨论。
在本节中,我们将了解什么是 Linux 文件链接以及如何使用它们。您可能已经知道,文件存储在硬盘上。在 Linux 文件系统中,文件的文件名和数据是两个独立的概念,不能一起存储。下图显示了总体结构:
将文件名连接到实际数据是由文件系统使用一个称为标题分配表的表或数据库数据结构来管理的。在 Linux 文件系统中,Inode 是硬盘上特定文件数据的实际入口点或起始点。为了简化,我们可以说 Inode 代表文件的实际数据。文件系统管理现在注意,每个正常文件在创建时,在其分配表中都有一个链接条目,用于将实际文件名连接到硬盘上的 Inode 或数据。这样的链接也叫硬链接。原始文件名到 Inode 的关系也是使用硬链接链接的,这就是为什么在最后一节中ls -l
命令为权限旁边的列中的大多数文件给出了编号1
。现在,Linux 文件系统很酷的一点是,您可以创建到现有 Inode 的额外硬链接,这就像给文件取一个替代名称一样。
硬链接的缺点之一是无法将硬链接与原始文件名或信息节点区分开。这可能会导致问题和副作用,因为如果您更改原始文件的内容,硬链接的内容也会随之更改。硬链接的另一个限制是,您只能为 Inodes 定义它们,Inodes 与硬链接位于同一分区。此外,您不能在目录上创建硬链接。您只能在普通文件上创建它们。要解决硬链接的这些限制,可以使用软链接,也称为符号链接。作为一名 Linux 系统管理员,在日常工作中,您几乎会一直使用这些类型的链接。硬链接也有其特殊的用例,例如,用于创建文件的备份,但是很少被 Linux 用户使用。
符号链接是指向文件名而不是索引节点的链接。符号链接也没有边界,即它们必须与原始文件在同一个分区或硬盘上。您也可以在目录上创建符号链接。主要缺点是,如果删除或移动原始文件,会出现符号链接断开的情况,没有进一步的警告,这也会产生一些不好的副作用。符号链接的主要用例和功能是引用 Linux 文件系统中的配置文件或动态库版本。使用链接可以节省大量磁盘空间,因为不必复制实际数据,而且它们对于快速测试服务的备用配置文件非常有效。
文件链接由ln
命令管理。基本语法是ln [OPTION]
,然后是要创建链接的文件名,最后是链接名。要在您的home
目录中创建一个名为fileX
的文件的硬链接,请使用以下代码:
如您所见,无法区分附加硬链接和原始链接。您也可以在同一个文件上创建多个链接。要删除硬链接,请使用rm
命令。每个文件系统上有最大数量的索引节点,或者我们可以简单地说文件,您可以使用df -i
显示这些文件。如果您使用mount
命令,您将看到用户的tmp
文件系统与home
目录位于不同的分区,后者又位于根分区,如下图所示:
所以下一个命令ln ~/folderABC ~/folderABC_link
会失败,因为不允许在分区之间创建硬链接。此外,您不能在目录上创建硬链接,更改文件内容的来源也会更改硬链接的文件内容。这会产生一些不好的副作用。要创建符号链接,请使用ln -s
选项:
如您所见,很容易显示一个文件是否是用箭头标记的符号链接。要在另一个目录中创建文件的符号链接,同时保留原始文件的名称,可以使用ln -s /etc/passwd
。这在当前目录下以相同的名称passwd
创建了/ etc/passwd
文件的符号链接。要删除符号链接,使用rm
命令;原始文件将不会被触摸。您也可以在目录上创建符号链接。如果删除符号链接指向的原始文件,也就是这里的fileX
符号链接将会断开。这可能会有问题,这里用蓝色表示:
在本节中,我们将学习如何在 Linux 中搜索文件。man find
命令,顾名思义,可以根据多种标准查找文件。但不仅如此,您甚至可以在程序执行期间对每个搜索结果应用操作,这是一个非常有用的功能。Find 可以采取一些选项来改变它的默认行为,例如,如何处理文件,这些文件是程序执行过程中的符号链接。前几个参数是开始搜索的目录或起始点的列表,所有其他参数都是搜索表达式或搜索条件。讨论什么是搜索表达式很重要。搜索表达式通常是一个测试和一个操作。测试通常由逻辑运算符分隔。如果没有给定运算符,则假定为结束运算符。如果表达式不包含用户的操作,那么将对搜索结果中的所有文件执行print
操作。
在我们开始使用man find command
之前,了解man find
命令如何处理搜索结果是很重要的。对于搜索路径列表中的每个文件,所有表达式都是从左到右计算的。默认情况下,只有当所有表达式都正确时,man find
命令才会将文件标记为命中。如果您喜欢使用OR
表达式,您也可以更改这个逻辑结束行为,我们将在后面的一个示例中看到。man find
命令允许您使用大量非常有用的文件测试表达式创建非常复杂的搜索查询。如果您在man find
命令的手动页面中搜索tests
,您将获得所有可用测试操作员的完整列表。例如,您可以搜索在过去特定时间修改或访问过的文件,或者具有特定大小的文件。如前所述,默认操作是对每个文件匹配的print
操作。另一个非常有用的操作是exec
表达式,它允许您为每个文件匹配执行一个特定的命令。man find
命令是一个非常复杂的命令,我们无法在这里向您展示所有内容。因此,在本节的剩余部分,我们将向您展示一些非常有用的用例。您可以使用find
命令,无需任何选项或参数。这与写入相同,因为没有任何选项和参数,搜索路径是当前目录,默认操作是print
操作。这个命令遍历当前目录,递归打印出所有文件和目录,包括所有子目录和子目录下的文件。它这样做是因为您没有提供任何测试表达式,所以它将只匹配您当前目录中的任何文件或目录,并对其应用print
操作。如前所述,find
命令之所以如此强大,是因为它包含了大量不同的测试表达式,可以根据各种有用的条件来定位文件。这种文件搜索测试可以是任何可以想象的,例如时间戳、用户权限、用户、组、文件类型、日期、大小或任何其他可能的搜索标准。
对于以下示例,我们将使用在安装过程中设置的 root 用户帐户,因为在此处显示的示例中,我们在系统目录中搜索了很多,这些目录需要特殊权限。要为文件名logrotate.conf
在/etc
目录中只搜索文件而不搜索目录,请使用以下命令:
find /etc -type f -name logrotate.conf
如果找到了文件,就不会遇到任何错误。这个命令在后台做的是遍历/etc
目录,拾取/etc
目录中包含的所有文件和子目录,并逐个递归处理。然后,对于每个文件,它检查该文件是否是实际文件,以及名称是否等于文件名。您也可以使用多个目录作为搜索起点,也可以使用-type d
仅搜索目录,这将打印出所有以/etc
和/var
目录开头并以字母y
开头的子目录名称:
这里,名称表达式采用普通的 POSIX 5 globbing 字符,而不是正则表达式。如果要使用正则表达式进行文件搜索,请使用-regex
表达式。请注意,如果使用-iname
表达式,它将搜索不区分大小写。您也可以使用文件大小作为标准来搜索文件:
find / -type f -size +4M -name 'l*'
搜索所有等于或大于 4 MB 的文件,从名称l
开始,只搜索文件,不搜索从root
目录开始的目录,这意味着它将递归搜索整个文件系统树。如您所见,只有两个文件符合所有这些条件。顺便说一下,+
代表更大或相等,如果你使用一个-
符号,它代表小于。您还可以搜索特定的文件权限。文件权限一般将在后面的章节中讨论。要获得在整个文件系统中搜索的每个人都具有读、写、执行权限的所有非常危险的目录的列表,我们使用以下命令:
find / -type d -perm 777
请注意,如果用户没有为find
命令本身提供任何操作,则默认为print
操作,因此该命令会将每个匹配的文件打印到stdout
命令行。我们可以使用-exec
动作表达式来改变这一点,它将对每个匹配的文件在-exec
表达式之后应用一个命令:
find / -type d -perm 777 chmod 755 {} ;
在我们的示例中,chmod 755
命令将使用占位符{}
应用于每个匹配的文件,该占位符代表匹配。这里的find
命令将搜索所有具有非常危险的文件权限的文件,777
,并将其更改回更温和的权限,755
。所以如果我们再次搜索危险许可,结果将是空的。为什么我们要逃避分号?这是因为通常 Bash shell 中的分号分隔命令,所以我们必须在这里禁用它的特殊含义。在目前显示的所有示例中,单个find
命令的所有测试和表达式必须为真,文件才能算作匹配。
例如命令find / -type f -size +4M -name 'l*'
如果文件是文件类型,并且大小为4
MB 或更大,并且名称以l
开头,则仅匹配并打印出文件。这三个测试表达式都必须是true
,并通过逻辑“与”连接。默认情况下,逻辑“与”运算符连接所有测试表达式,这意味着只有当所有测试表达式都为真时,文件才能匹配为命中。您可以使用-or
表达式轻松地将逻辑“与”转换为逻辑“或”,例如:
find / -type f -name p*.conf -or -name 'p*.d'
这将匹配所有以p
开头并在/etc
目录中具有扩展名conf
或.d
的文件,并具有类型文件。还有一些非常有用的基于文件时间的测试表达式。例如,find /var -mtime 10
| head 将输出最近三天内修改过的所有文件,只输出最近三天或更长时间前的第一次10
点击。使用基于时间的测试表达式非常有用,作为系统管理员,在日常工作中经常需要用到。例如,如果您需要删除服务器上运行的 web 应用的用户上传的所有早于30
天的文件,您可以执行以下操作:
find /var/www/webapp-uploads -mtime +30 -exec rm {} ;
这个命令也可以很容易地放入每天运行的脚本中,比如在Cron
作业中,以自动删除所有早于30
天的文件,因此您不必再手动处理这个问题。要搜索整个文件系统中的所有文件,这些文件以l
和r
开头,大小在 1 到 4 MB 之间,请使用:
find / -type f -size +1M -size -4M -name 'l*'
您也可以使用locate
命令快速搜索文件,而不是使用查找。首先需要使用package
和locate
进行安装。locate
命令不在文件系统中进行实时搜索,而是使用特定时间点的文件系统快照。该数据库每天都会在某个时间点更新,但您也可以使用以下方法自行重新生成快照数据库:
updatedb
现在如果你使用locate
命令,它将在你刚刚生成的数据库中搜索所有匹配名称logrotate
的文件。这将只搜索文字文本。如果要用于正则表达式,请使用--regex
选项。
当我们搜索数据库时,这通常比使用find
命令进行实时搜索更快,但请始终记住这不是当前文件系统的实时状态。因此,您可能会遇到问题,尤其是在搜索比搜索数据库更新的文件时。
在本节中,我们将学习如何创建和删除用户和组,以及如何向用户添加组。此外,我们将看到 Linux 如何在内部存储用户信息和密码,以及如何以编程方式检索用户信息。最后,我们将学习如何在登录时替换用户帐户。Linux 是一个多用户系统,这意味着多个用户可以同时使用该系统。因此,需要一个系统来保证对 Linux 对象(如文件)的通用访问,使用过度保护措施。例如,一个用户创建的所有文件都不应该被另一个用户删除。每个 Linux 用户都由一个唯一的用户标识来定义和识别,因为人类可以更容易地使用名称而不是数字。还存在一个连接到每个用户标识的文字用户名,但是当管理对文件等 Linux 对象的控制时,Linux 内部使用用户标识 ( UID )号。有两种类型的用户帐户,需要密码进行身份验证的登录用户和非登录用户,这对于将用户标识附加到正在运行的程序或进程非常有用,我们将在后面看到。每个 Linux 系统上都有一个特殊的帐户,根用户帐户,或者管理员帐户,我们在安装过程中为其设置了密码。每个系统上的这个帐户都有访问权限,并且是所有对象的所有者,例如 Linux 系统中呈现的文件,并且这个帐户可以对系统做任何事情。如果在 Linux 中我们有用户名来控制对文件的访问,那么授予或撤销权限将是非常有限和耗时的。因此,Linux 也有组的概念来进行访问控制。通过将共享资源的权限分配给组,而不是单个用户,使用组可以极大地简化权限管理。向组分配权限会向该组的所有成员分配对资源的相同访问权限。Linux 组也由组标识来表示,组标识是一个数字,但也可以通过其名称,即组名来引用。Linux 中的每个用户只有一个 UID,但可以属于多个组或组 ID。一个组是主组,当该用户创建新文件时将使用该组。
让我们从为我们的测试创建一些新的用户帐户开始。只有root
可以做到这一点。首先,让我们以 root 用户身份登录。useradd
命令用给定的用户名作为参数添加一个新用户。该命令在系统中创建新用户,并创建相应的主目录。为了使我们的新登录帐户正常工作,我们还需要设置密码;我们可以通过passwd
命令做到这一点。您也可以使用此命令更改自己的密码。要为其他用户设置或更改密码,我们键入passwd ``username
-这只能使用根用户帐户完成。要删除用户,请使用userdel
命令。默认情况下userdel
命令不会删除用户的home
目录,所以你要自己做。要删除用户,最好使用userdel -r
标志,这样不仅会删除用户,还会删除关联的home
目录和邮箱。让我们重新创建用户。让我们注销根用户。您可以在登录时使用su
命令或替代用户命令来切换用户。当您在没有任何参数的情况下调用su
命令时,假设根用户被切换。要将替代用户切换到不同的用户,可以使用用户名作为第一个参数。您可以使用whoami
命令重新检查谁登录了。使用su
命令,将保留已执行su
命令的用户的原始环境,不会切换到替代用户账户的家庭用户。
现在,让我们退出替代用户并切换到另一个用户。使用带有破折号的su
命令作为参数,我们创建了一个更像登录 Shell 的环境,这意味着它的行为更像一个真正登录 Shell 的用户。通过执行pwd
,您可以看到home
目录已经更改为替代用户的home
目录。现在,再次退出替代用户。您也可以使用su -c
标志直接使用另一个用户帐户执行单个命令;su
用户名-c
。如果您希望使用不同的用户帐户快速启动脚本或命令,而不完全切换用户,这将非常有用。
Only the root user is allowed to substitute users using the su
command without providing a password. Any other user who wants to use the su
command needs to know the password of the substituted user.
useradd
和passwd
命令正在对etc/passwd
和etc/shadow
文件进行更改,这是整个 Linux 系统中存储身份验证和用户信息的最重要的文件。passwd
文件存储了系统已知的所有用户帐户、所有登录用户和所有系统用户的列表。登录用户是典型的自然人,他们可以使用密码登录到一个 Shell(如 Bash Shell)进行身份验证。系统用户通常无法登录 Shell,并且通常与系统服务和进程相关联。
例如,要获得 Linux 系统中所有可用用户名的列表,请使用:
awk -F: '{print $1}' /etc/passwd
passwd
文件存储了很多有用的信息,比如用户的home
目录、默认 shell 或者用户 ID 号。更多信息请参考passwd
命令的手册页。/etc/shadow
文件以加密格式包含所有用户的所有密码信息。您需要根用户帐户才能查看此文件。要创建新组,请使用groupadd
命令;要删除组,请使用groupdel
命令。groupadd
和groupdel
命令在内部使用/etc/group
文件。该文件向您显示系统中所有可用的组以及与这些组相关联的所有用户标识。您也可以使用id
命令,而不是读取/etc/group
或/etc/passwd
文件来获取用户信息。这将告诉您用户标识、组标识以及用户拥有的所有关联组。要向用户添加现有组,可以使用usermod -G
命令。-G
覆盖用户拥有的所有次要组,保持主要组不变。您还可以定义要添加到用户名中的逗号分隔的组名列表。重要的是要记住-G
总是覆盖用户现有的组名。
现在,让我们检查permission string
,它根据文件所有者、组所有者或任何其他用户是谁来指定允许或不允许他做什么:
-l
输出第三列的文件所有者。这里是root
,这个文件是olip
。在第四列中,ls -l
输出文件的组所有者。还有,这里是root
,这里是olip
。您已经知道ls -l
输出的第一个字符是文件类型。现在,后面的 9 位l
和d
定义了文件的权限字符串。权限字符串的前三个字符定义了文件所有者的权限。权限字符串的后三位定义了组所有者的权限。权限字符串的最后三位定义了所有其他用户的权限。在本例中,folderABC
有文件所有者olip
,组所有者olip
。此外,文件所有者olip
对目录拥有完全权限,组所有者olip
对目录拥有完全权限,所有其他用户对该目录拥有读取和执行权限。
请执行以下步骤:
- 首先,让我们创建一个目录。我们将放入一些要使用的文件,然后切换到目录:
- 现在,让我们创建一些文件来玩。
- 让我们看看刚刚创建的文件的文件权限。
- 正如您在前面的截图中看到的,根用户已经创建了所有这些文件。因此,所有文件的文件所有权和组所有权都是
root
。 - 现在,要更改文件所有权和组所有权信息,可以使用
chown
或chgrp
命令。 - 除了使用
chgrp
命令,您也可以使用不同的符号使用chown
命令。 - 例如,要更改文件的组,您可以修改文件所有者和组所有权。
- 让我们也创建一些子文件夹来测试目录权限。
- 把一些文件也放进这些文件夹。
- 接下来,让我们使用一些非常危险的
test
目录,这样每个人都能够在我们的测试中正确地处理文件。这不是为了生产。 - 接下来,为我们的文件创建一些通用权限。
- 创建一些不寻常的权限,也为目录测试创建一些权限。
- 更改文件的某些文件所有权权限和目录的组所有权权限。
现在,让我们使用新文件并更改权限。让我们首先回顾一下ls -l
命令的输出:
文件一是对任何人都具有完全读、写和执行权限的文件。例如,系统已知的任何用户都可以修改该文件。下一个文件拥有每个文件在 CentOS 7 机器上创建时获得的标准权限。文件所有者拥有读写权限,而组和所有其他用户只有读取权限。让我们看看如果不同的用户想要修改文件,这意味着什么:
在这里我们可以看到一些有趣的事情。root
用户拥有对任何文件的读、写和执行权限,不管在root
用户的权限字符串中设置了什么。Peter
是文件的主人,所以他可以给这个文件写信。Paul
既不是文件所有者,也不是组所有者,所以他根本没有写权限。下一个文件具有通常用于机密文件(如密码文件)的权限。对于运行文件系统用户帐户的服务来说,这通常是为了防止其他人读取凭据:
在这个例子中,只有root
用户有能力读取文件,没有其他人。如果不仅文件所有者,而且拥有该文件所属组的组成员都应该完全控制该文件,则使用下一个文件的公共权限集。如您所见,Peter
和Paul
无权写入此文件,因为他们既不是文件所有者,也不是组所有者。要改变这种情况,让我们将Peter
添加到拥有该文件的组中,然后再次测试:
现在,file5
有一些不寻常的权限,是有效的。file5
是一个脚本文件,打印出来的东西。如您所见,只有root
用户可以执行该文件。要让Peter
执行脚本,请将与之关联的一个组添加到文件中。这仍然不起作用,因为现在Peter
可以执行这个文件,但是不能读取它。要更改这一点,还需要为文件的组所有权添加读取权限。现在,Peter
终于可以运行脚本了:
最后,一个常见的误解是,要删除一个文件,您需要为用户正确设置文件的写权限标志,但正如我们所看到的,这是不正确的。为什么Peter
不能删除这个文件,尽管我们已经为这里的每个人分配了完全权限?这是因为文件删除完全取决于您要删除的文件所在目录的写权限,而不取决于任何文件权限。以下截图是用户Peter
被拒绝删除文件的情况:
最后,让我们讨论目录权限。下面的截图就是一个例子:
folderA
拥有文件所有者的读取权限,所以他是唯一一个能够看到文件夹中的内容但不能更改到目录中的人。folderB
对组所有者只有读取权限,这意味着只有projectA
组的成员可以更改到该目录,但是Peter
除了使用cd
命令进入该文件夹之外,不能在该文件夹中执行任何操作:
为了列出此目录中的文件,让我们将读取权限排序给组所有者:
如前所述,我们需要在目录上启用write
标志,以便在其中创建或删除新文件。但是为什么这里不行?这是因为我们还需要对目录启用执行权限,这很有意义,因为为了在目录中创建或删除文件,我们需要能够访问该目录。如果我们想更改许多文件的权限,例如整个子目录树,我们可以做什么?使用ls -lR
标志,我们可以列出包含的所有子目录和文件。现在,要更改子目录中所有文件的权限字符串,可以使用chmod -R
标志:
ls -lRchmod 775 -R ../test_files
像往常一样,小心递归标志,因为您可以轻松地将整个文件系统的文件权限更改为不可逆的不安全权限。
在本节中,我们将学习 Linux 中文件访问控制的概念。我们还将学习和理解如何读取文件权限。最后,我们将学习如何更改文件所有权以及文件权限,并向您展示实用的文件权限示例。如果您使用ls -l
打印出文件的详细信息,您将看到一个不同的重要文件属性列表,我们需要了解这些属性,以便了解文件权限。典型的ls -l
输出看起来像-lrwxr-xr-x olip administrator my-awsome-file.txt.
系统中的每个文件都与一个用户名相关联,该用户名也被称为文件所有者。
每个文件也只与一个组名相关联,该组名也被称为组所有者。文件的文件所有权只能由根用户更改。文件所有者也可以更改组所有权。当用户创建新文件或目录时,文件的所有权将被设置为创建该文件的用户的 UID。我们已经知道一个用户可以属于多个组,但是需要将一个组设置为主组。这就是为什么创建的每个新用户都有一个与用户名同名的组。现在,每个想要访问文件的 Linux 用户都可以归入这些组中的一个。如果用户标识与我们要访问其文件的文件所有者的标识匹配,则用户就是文件所有者。如果用户关联的某个组与他想要访问的文件的组所有者匹配,则该用户就是组所有者。如果用户不是文件或组的所有者,则属于其他用户类别。这三个权限类别也称为权限组。最后,所有这些权限组,即文件所有者、组所有者和其他组,都恰好有三种权限类型:读取、写入和执行。这些权限类型管理属于这些组之一的用户可以或不能对文件执行的实际操作。
现在,由于我们正在处理每个文件的许多不同信息,用户所有者、组所有者、权限类别和权限类型,一些 Linux 命令,如ls
命令,使用非常紧凑的形式进行查看,它使用 9 位来完全映射所有权限组的所有权限。这 9 位信息也称为权限字符串。如果许可被授予读/写/执行,或者rwx
标志被置于字符串中的固定许可。如果权限被撤销,可以在字符串中的特定位置找到破折号。权限字符串中从左到右,前三位是文件所有者的读/写/执行权限。接下来的三位用于组所有者,最后三位用于所有其他用户。9 位权限字符串是一种非常密集的符号,适合屏幕,并且来自计算机硬件中空间和内存非常昂贵的时代。对权限类型或 9 位权限字符串的更改只能由根用户设置或删除。文件和目录的读、写和执行权限定义不同。
让我们首先讨论在文件上下文中读、写和执行意味着什么。如果在文件上设置了r
或“读取”标志,则相应的权限类别、文件所有者、组所有者或其他用户可以打开文件并读取其内容。w
或写标志是修改或截断现有文件,但知道写标志不允许创建新文件或删除现有文件是一个常见的误解和重要事实。这不是文件的属性,而是父目录的属性,我们很快就会看到。x
或执行标志允许执行文件。这对于在命令行上运行脚本文件或命令非常重要。
In order to execute a file to run it as a script or command, the read flag needs to also be set because the shell needs to read the content of a file in order to execute its instructions. In a directory context, read, write, and execute permissions mean something completely different than working on files, which every Linux user must be aware of.
让我们首先从x
或执行权限开始,因为这是文件夹最基本的权限。x
或者说执行,目录上下文中的权限与文件上下文中的权限完全不同。如果在文件夹上设置了执行标志,这意味着允许相应的用户组或其他人将该目录或路径输入目录,例如,使用cd
命令。但是x
标志不仅对cd
命令很重要,如果您需要使用写标志重命名、删除或创建新文件,它也是强制性的。这里也必须设置执行标志。如果需要使用写标志重命名、删除或创建新文件,这也是必需的。根据经验,如果您需要在文件夹上设置一些标准权限,请不要错过您要使用的权限组的执行权限,否则您将遇到问题,因为如果您想要执行一些操作,您总是需要更改到目录中。r
或“读取”是读取目录内容的权限,例如,使用ls
命令。
w
或写标志在目录中创建新文件或删除现有文件。正如我们之前看到的,删除或创建新文件不是文件权限的属性,而是您想要创建或删除的文件所在的目录权限的属性,因此如果您想要能够在其中创建或删除文件,必须设置写标志。为了使用写标志来创建、删除或移除文件,我们还需要为诸如touch
或rm
之类的命令设置执行标志,因为它们需要访问目录才能执行操作。
现在,操作系统正在根据尝试访问是否合法来检查每个想要对文件或目录执行操作(即读、写或执行)的实际用户。这是一个分层的过程。正在进行的第一项检查是希望处理文件的用户的用户标识是否与文件的用户所有者匹配。如果不是这种情况,如果用户的组标识与文件的组所有权匹配,则会检查所有用户的组标识。如果根本没有用户组匹配,则假定另一个用户将被使用。现在,系统中的每个用户都匹配这三个权限类别中的一个。如果找到了正确的类别,将检查相应的三种权限类型,读、写和执行,以查看它们是否被允许,以及它们是否与用户尝试的读、写或执行操作相匹配。
最好使用基于八进制计数的快捷方法来更改 9 位权限字符串中的值。请注意,还有另一种使用短选项的符号,如-
、+
、r
、w
和e
,我们将在本节中不再讨论。可以使用man chmod
进行查找。使用0
和7
之间的数字,这是八种不同的状态,因此可以称为八进制表示法,我们可以为每个权限类别、用户所有者、组所有者或其他用户唯一地定义读、写和执行的每种可能的组合。
以下是chmod
八进制符号:
0
:使用0
,不允许有读、写、执行权限1
:表示仅执行权限2
:表示只有写权限4
:表示只读权限3
:表示执行和写入权限的组合5
:表示只执行和只读取注释的组合6
:表示写权限和只读权限的组合7
:表示完全权限或读、写、执行权限
因此,我们只需使用三个数字,就可以轻松地表达所有三个权限类别的权限类型。第一个数字表示文件的用户所有者的读、写和执行权限。第二个数字代表组所有者的所有文件权限,第三个数字代表系统中所有其他用户可用的所有读、写和执行权限。例如,八进制权限777
意味着系统中所有可用用户的读、写和执行权限。775
权限是指文件的用户所有者的读、写和执行权限,文件的组所有者的读、写和执行权限,以及系统中所有其他用户的读和执行权限。660
权限是指文件的用户所有者的读写权限,文件的组所有者的读/写权限,对系统中的所有其他用户没有任何权限,这意味着他们不能读、写或执行该文件。
由于我们在上一节中创建了一些新用户、Peter
和Paul
以及关联的组project_a
和project_b
,现在让我们使用实际的文件权限进行工作和实验:
- 当我们在本章第一次以 root 用户身份登录时,正在处理权限问题。
- 现在,让我们首先创建一个目录,放入一些要使用的文件:
mkdir test_files
- 然后切换到这个目录:
cd test_files
- 现在,让我们创建一些文件来玩:
touch file1
touch file2
echo "my_secret_pa$$worD" > file3
touch file4
printf '#!/bin/bashnecho "EXEC"' > file5
- 我们来看看使用
ls-l
的文件权限。
我们现在知道,每个文件都有一个文件所有者,这可以在第三列的ls -l
输出中看到。每个文件的第四列都有一个组所有者。ls -l
输出的第一个字符是文件类型,后面是 9 位权限字符串。
首先,让我们学习如何更改文件的用户所有者。您可以使用chown
命令更改文件的用户所有者。您可以使用chgrp
命令来更改文件的用户组。让我们再次使用ls -l
来看看发生了什么变化:
如您所见,file1
和file3
已经更改了用户所有者,file4
有了新的组所有者。除了使用chgrp
命令,还有一种定义文件组成员的替代方法,系统管理员经常使用。它有以下符号:
chown [username]:[groupname] [file]
这使用冒号来指定文件的用户所有者或组所有者。例如,要仅更改文件的组所有者,请使用:
chown :project_b file 4
或者更改用户名和组用途:
chgrp project_a file 4
让我们也创建一些子文件夹,以便稍后测试目录权限。把一些文件放在我们新创建的子文件夹中。接下来,让我们对test
目录使用一些非常危险的权限,这样每个人都能够在我们的测试中正确地处理文件。这不是为了生产。
如前所述,我们将使用chmod
八进制表示法来更改 9 位权限字符串文件权限。接下来,让我们为新的测试文件创建一些通用权限。还有,为了展示东西,创建一些不寻常的权限。此外,更改我们测试目录的权限:
最后,为了准备我们的测试,我们还需要更改一些目录上的一些用户所有权权限和组所有权权限。现在,让我们玩玩我们的新文件和文件夹的权限。file1
是一个文件,对任何人都有完全的读、写、执行权限。这是一个非常危险的权限,在任何情况下都不建议使用,因为任何人都可以修改此文件:
如您所见,peter
和paul
可以修改该文件并对其拥有完全访问权限。下一个file1
、file2
,拥有权限,拥有每个文件在创建时获得的标准权限。文件所有者可以读写,组和所有其他用户只能读取和执行,不能修改。
让我们看看如果不同的用户试图写入这个文件会发生什么:
如您所见,只有文件所有者可以写入此文件;所有其他用户都没有写权限。下一个文件具有通常用于保护机密数据(如密码文件)的权限。
如您所见,只有文件所有者可以读取文件,其他任何人都不能对文件执行任何其他操作。文件所有者为paul
。如果你试图用不同的用户名来读取这个文件,你会学到两件事。首先,不管对文件设置了何种权限,根用户始终拥有对文件的完全访问权限。第二,除了根用户,无论如何他对一个文件有完全的访问权,在这个例子中只有paul
,他有读访问权,可以读这个文件,而没有其他人。
下一个文件使用了公共权限集。不仅文件所有者,而且文件唯一组的成员都应该完全控制文件:
如您所见,olip
和peter
都对该文件具有写访问权限,paul
无权访问该文件。olip
拥有文件的写权限,因为他是文件所有者。peter
可以访问文件,因为组所有者也可以访问文件,彼得是project_a
组的成员,也是文件的组所有者组的成员。
现在,file5
有一些不寻常的权限,是有效的。file5
是一个脚本文件,它打印出一些东西:
正如我们所看到的,只有根用户有权限执行这个文件。要执行一个脚本,我们将使用./
符号,我们将在后面的另一节中看到。为了使peter
可以执行脚本,我们可以将project_a
组添加到file5
中,因为我们知道peter
是该组的成员。但是等等,为什么当peter
是project_a
组的成员并且project_a
有权限执行脚本的时候,我们会出现权限被拒绝的错误?这是因为为了让 shell 运行脚本,它还需要访问权限来读取脚本文件的内容。因此,让我们更改文件的权限,以包括读取标志。现在,用户peter
可以执行脚本了。对于root
用户,不需要设置读取权限,因为root
用户拥有每个文件的所有权限,不管权限字符串中说了什么。
最后,一个常见的误解是,为了删除文件,您需要为想要删除文件的用户正确设置文件的写权限标志,但事实并非如此:
如果这是真的,为什么彼得不能删除这个文件,因为我们给这里的每个人都分配了完全权限?这是因为文件删除完全依赖于您想要删除的文件所在目录的写权限,而从来不依赖于任何文件权限。所以,在这个例子中,我们要删除的文件在root
目录下,这个目录对用户 Peter 完全没有写权限。所以彼得不能删除或创建/root
目录中的任何文件。
最后,让我们讨论目录权限。让我们首先回顾一下测试文件夹的目录权限。为此,让我们切换到test
文件夹的目录。我们先测试一下folderA
的权限:
如您所见,folderA
只有文件所有者的读取权限,所以只有 Peter 能够读取folderA
中的所有文件和子文件夹;没有其他人能做到这一点。您还可以看到,因为目录上没有设置执行标志;没有人能进入这个目录。
现在,让我们来看看folderB
:
由于在project_a
文件夹上只设置了执行权限,并且只为组所有者project_a
组设置了执行权限,因此只有属于project_a
组的彼得可以cd
进入该目录,但是不能列出文件。因此,总是将目录上的执行标志与读取标志结合起来总是一个好主意。folderC
也是如此。首先,让我们测试一下是否有人能够在这个目录中写入文件:
su peter -c 'touch folderC/a-new-file'
如你所见,没有人能做到。如果您查看文件夹权限,这是因为我们的用户都没有该文件的所有权权限。
那么,让我们将用户所有权设置为用户olip
。仍然没有运气与用户olip
在folderC
中创建新文件。这是因为为了在目录中创建新文件,不仅必须在目录上设置写权限,还必须设置执行权限。如果要删除目录中的文件,也是如此。最后,我们如何为所有条目递归地更改整个子目录树的文件和文件夹权限?为了仅用一个命令递归地改变包含在folderA
中的所有文件和文件夹,使用代表递归的chmod -R
标志,并且改变作为参数给出的目录中的所有文件和文件夹条目。您也可以将-R
标志用于变更所有者命令。像往常一样,非常小心递归标志,因为您可能会将文件更改为权限。说到理解 Linux 中的权限,有三件事你需要记住。这三个概念必须从左到右使用。首先,每个文件都有一组用户所有者、组所有者和所有其他用户的权限状态,简称为u
、g
和o
。对于这些类别中的每一个,都存在三种可能的权限状态,读、写和执行,或r
、w
和x
。对于r
、w
和x
,读、写和执行可以分别用八进制数 4、2 和 1 来表示。您想要允许的读取、写入和执行的每个组合都可以由相应的八进制数值的读取、写入和执行的总和来表示。
在本节中,我们将学习在命令行上打印出文本文件内容的所有重要工具。我们还将学习如何使用文本文件查看器查看文本文件。在 Linux 中,有两种不同的基本文件类型,文本文件和二进制文件。文本文件是配置文件,而二进制文件可以是图像文件或压缩数据文件。文件的编码定义了文件应该被视为文本文件还是二进制文件。文本文件通常使用 UTFR。在 Linux 上,文本文件通常使用 UTF 8 或 ASCII 编码。您可以使用file
命令检测文件类型,如:
file /etc/passwd
file ~file4.tar.gz
要打印出文本文件的内容,可以使用cat
命令。cat
代表 concatenate,这也是命令得名的原因。因此,让我们连接一些文件,并通过重定向stdout
将结果放入一个新文件中:
cat /etc/passwd /etc/grp /etc/services > /tmp/concatenated-file
这一行将三个文件passwd
、group
和services
连接到/tmp
目录中一个名为concatenated-files
的新文件。有时候用cat
打印出整个文件的内容纯粹是矫枉过正。如果我们只对文件开头或结尾的一些行感兴趣,我们可以使用head
或tail
命令来代替。文件的开头有时也称为文件头,而文件的结尾也称为文件尾。要显示新串联文件的第一行10
,请使用:
head /tmp/concatenated-file
或者,如果您只对我们新文件的最后 10 行感兴趣,请改用:
tail /tmp/concatenated-file
要更改打印前 10 行的head
和tail
默认行为,请使用-n
选项。头尾还有其他非常有用的选项,使用手册页了解更多。一个更重要且经常使用的功能是使用tail follow
选项。例如,使用root
帐户的follow
选项,-f
标志保持tail
命令打开,如果新文本被附加到var/log/messages
文件,tail 将持续监听新文件内容并输出。如果你需要一个永久实时写入的文件的实时视图,这个命令需要记忆。要关闭尾部程序,使用 Ctrl + C :
su root -c 'tail -f /var/log/messages'
现在,要读取文件的内容,cat
命令可以用于较小的文件。对于更大的文件,最好使用真实的文本查看器程序,如less
,它具有一些强大的功能,如搜索、滚动和显示行号。学习如何使用 less 命令导航文本文件也非常有用,因为许多 Linux 命令正在使用 less,也称为 less 导航,来浏览页面或设置的文本内容,我们将在后面看到。要使用较少的资源打开文件,可以使用较少的资源,然后使用文件名作为参数。你也可以直接使用stdout
,除非使用管道,这非常有用,这样我们可以轻松导航和滚动更大的命令输出,这不适合屏幕。少导航非常简单,应该记住,因为你会在你的 Linux 职业生涯中大量使用它。还有很多要学的。阅读 less 命令的手册页,查看所有可用选项。
许多运动动作可以通过以下方式完成:
- 要向下滚动一行,可以使用箭头键或 J 键。在这里,我们将只向您展示这些键盘选项中的一个。
- 要退出 less 命令,请使用 Q 键。
- 大写的 G 滚动到文件结尾,小 G 滚动到文件开头。
- 向下箭头键逐行向下滚动。
- 向上箭头键逐行向上滚动。
- 按下向下翻页键向下滚动一页,按下向上翻页键向上滚动一页。
- 按右箭头键向右滚动较长的行;要向左滚动,请使用左箭头键。
- 按 Ctrl + G 在页面底部显示文件信息。
- 按返回键退出文件信息栏。
- 键入斜杠键后跟搜索词,例如
HTTP
,并按下返回键,使用正向搜索在文件中搜索关键字HTTP
。 - 按下 n 键将跳转到下一个搜索结果。按下大写 N 键将跳回到搜索结果的最后一种形式。
- 请注意,如果搜索模式全部为小写,则搜索不区分大小写;否则,它区分大小写。例如,如果您搜索单词
HTTP
都是大写字母,它只会找到模式,这些模式正好具有区分大小写形式的 HTTP。 - 现在,按大写 G 跳到文件的末尾。
- 使用正斜杠键的普通搜索从上到下搜索文件中的关键字。
- 如果您想反过来搜索关键字,从下到上,您可以使用问号运算符、问号键,然后是关键字。
- 按下 n 键跳转到文件中下一个更高的搜索结果。按大写 N 跳转到搜索结果的最后一种形式。
Less -N
在行号模式下开始较少,这意味着每一行都以对应的行号为前缀。- 要转到特定的行号,例如第 100 行,请键入行号,后跟一个
g
,或者要转到行号20
,请键入20g
。 - 要查看文本文件而不编辑它,您也可以使用 VIM 编辑器。
- 要以只读模式启动 VIM,请键入视图空间,然后键入文件。
- 我们将在下一节继续使用 VIM 编辑器。
在这一节中,我们将学习如何安装改进的 vi,简称 VIM,文本编辑器。我们还将学习使用 VIM 的所有基础知识。你能想象到的最简单的文本编辑器是,这将创建一个包含内容lorem ipsum dollar sit
的新文件my-lorum-file
,或者你可以使用cat
命令交互式地创建一个新的文本文件,如下所示
Another Line
this is the third line
EOF
使用大写的字符串EOF
停止写入该文件。现在echo
和cat
命令非常有用,如果你需要创建只有几个单词或几行文本的文本文件。如果你需要编辑更大的文本文件,或者想要自己编写文件,例如,项目的 read-me 文件,最好使用真实的文本编辑器。Linux 中可用的文本编辑器之一是 viM,或 VI 改进版,这是一个非常强大的文本编辑器,适用于每个 Linux 发行版。它允许无鼠标文本编辑,一旦你熟练使用 VIM,你就可以真正开始以思维的速度输入或编辑文本文件。但是掌握 VIM 可能需要几个月甚至几年的时间才能真正掌握好,因为 VIM 是一个非常复杂的编辑器,有很多不同的快捷方式和功能。因此,我们不能在这一部分向您展示所有内容,而只能介绍让您快速开始使用 VIM 的基础知识。
viM 是 VI 的改进版本,并且与 70 年代开发的 UNIX 文本编辑器完全兼容。在 CentOS 7 最小安装中,默认情况下不安装 VIM。所以,让我们从安装 VIM 编辑器- su root -c 'yum install vim -y'
开始。您可以打开 VIM,将文件名作为参数打开,也可以不打开,稍后保存文件名。VIM 最基本的概念是它的模式。有三种不同的模式。插入模式、命令或正常模式以及 ex 模式。下面的截图显示了不同的模式:
当您打开 VIM 时,您可以在正常或命令模式下启动。每种模式下,您都可以通过按下 Esc 键返回正常模式。如果你不知道自己目前处于哪种模式,这非常有用。只需按下 Esc 键,您始终处于正常模式。从那里,您可以切换到插入或 ex 模式。有几个键可以启动插入模式。按下 i 或 o 键将从命令或正常模式进入插入模式,您可以开始键入文本。如果您已经完成文本输入,或者您想要执行另一个正常模式命令或ex
命令,请按 Esc 键返回正常模式。从那里,如果你按下冒号键,你进入 ex 模式。从那里,按下返回或 Esc 键,返回正常模式。插入模式用于键入或插入文本。在插入模式下,每一次按键都会在编辑器的屏幕上打印出来。如果您想要导航光标或在文件中执行复制和粘贴、删除行、文本搜索或撤消、重做等操作,则需要切换到正常模式。在正常模式下,每次按键都是一个命令。Ex 模式用于执行ex
命令,例如跳转到文件中的某一行,或者替换整个文件,或者替换整个文件中的文本。
现在,我们将实际开始与 VIM 合作。首先,要退出编辑器,在正常模式下按以下顺序,按:q!
然后按返回键。如果你不在正常模式,比如你在插入模式,那么你首先要按 Esc 键,然后是:q!
,然后按返回键退出 VI。现在,让我们用/etc/services
文件再次打开 VIM。
让我们首先讨论基本的光标移动命令。光标移动命令只能在正常模式或命令模式下完成,这是启动 VIM 时的默认模式。如果您处于另一种模式,如插入模式,按下 Esc 键进入正常模式。现在,要移动光标,您可以使用各种键盘快捷键:
- 要向右移动光标,使用 l 键
- 要向左移动光标,使用 h 键
- 要向下移动光标,使用 j 键
- 要向上移动光标,使用 k 键
- 您也可以使用箭头键来执行前面的操作
- 要将光标移动到一行的末尾,按下 $ 键
- 要将光标移动到一行的开头,按下 0 键
- 要将光标向前移动一个单词,请使用 w 键
- 要将光标向后移动一个单词,请使用 b 键
- 要跳到文档的结尾,请使用大写 G 键,这也是少文本文件查看器中跳到文档结尾的相同键
- 跳到文档类型的开头
gg
- 这也类似于 less 命令,您使用小
g
一次跳转到文档的开头 - 要跳转到某个行号,请键入行号;例如,第 100 行,后面跟着一个大写的 G
- 在 VI 编辑器中搜索文本模式与在较少文本查看器中搜索文本基本相同
- 使用/关键字,然后按 return 键开始正向文本搜索
- 按小 n 跳转到下一个搜索结果
- 按大写 N 跳转到上一个前一个搜索结果
- 要开始向后搜索,首先按下大写 G 到文档末尾,然后使用熟悉的问号关键词进行搜索,并按下返回键从下向上开始文本搜索
- 按 n 跳转到下一个更高的搜索结果,按 N 跳转到文本文档底部的下一个更低的搜索结果
- 现在,再次跳到文件的开头
在正常模式下,一个非常有用的功能是在特定的线设置标记以供参考。例如,首先转到行域。要将标记设置到特定行,请键入字符m
,然后键入从 a 到 z 的另一个字符。例如,键入ma
。这会创建一个由行中的字符 a 引用的新标记,该标记从域开始。在以 domain 开始的当前行中,如果我们转到该文件中的不同位置,例如,逐页向下滚动,然后如果我们现在使用 tick 字符后跟代表我们标记的字符,例如'a,
,我们将跳回到我们设置参考标记a
的行。如前所述,您可以设置从 a 到 z 的多个标记,所以让我们添加另一个标记。去另一条线,比如安全线。现在,我们将使用b
作为我们的标记。让我们创建一个标记,键入mb
。现在,如果您转到文件中的不同位置,如 fido 行,只需键入'b
即可滚动回 saft 行。键入'a
返回到域线。就这么简单。
现在,我们已经学习了正常或命令模式下的基本移动命令,现在让我们切换到正常模式下学习一些删除命令。在正常模式下,按下 x 键将删除光标下的字符。按两次dd
键删除一行,并将删除的文本放入复制缓冲区。d 键也可以与其他键组合使用,以实现高效的文本删除。使用dw
删除光标下的当前单词。您甚至可以将dw
命令与一个数字组合起来,例如删除接下来的五个单词类型5dw
。你已经知道,为了跳到行尾,你使用 $ ,为了跳到行首,你使用 0 。如果要从当前光标位置删除到行尾使用d$
。另一方面,如果要从当前光标位置删除到行首,使用d0
。
现在,让我们看看删除文本的撤销和重做命令。u 键撤销最后一次更改。对于您执行的每个撤消步骤,您也可以使用 Ctrl + R 执行相应的重做步骤。现在复制粘贴命令,只需复制粘贴完整的线型yyp
。要复制多行,首先标记所有要复制的行。为此,按 Shift + V 开始您的标记,然后按向下或向上箭头键选择您想要复制的所有行。现在,按 y 键复制你的文字,然后按大写 P 插入你复制的文字。
您也可以剪切文本。为了剪切文本行,首先用大写 V 标记你的文本。现在,不要使用 y 键来猛拉或复制文本,而是按下大写 C 键来剪切文本。请注意,剪切文本将使您进入插入模式。要粘贴文本,需要回到正常模式;所以,现在按下 Esc 键。要将文本粘贴到其他地方,请使用大写 P 键。
现在,我们已经讨论了普通或命令模式下的所有基本命令,让我们转到插入模式。从正常模式到插入模式有几种方法。正常情况下,进入插入模式,可以使用小 i 和小 o 和大写 O 键。按小 o 在光标后进入插入模式的同时插入新的一行。按大写 O 在光标前进入插入模式的同时插入新的一行。按下 i 将直接在光标后进入插入模式,无需插入新行。
最后,我们来讨论一下ex
命令。让我们首先对文件进行一些更改。现在,为了执行ex
命令,我们首先需要进入正常模式,从插入模式按下 Esc 键,然后按下冒号键开始键入ex
命令。例如,要写入文件,请键入w
。这会将您的更改写入并保存到文件中。也可以使用:
输入ex
命令,然后按wq
编写并退出 VIM 编辑器。
现在,让我们再次打开 VIM。离开编辑器,按:q
并按返回键。如果您没有进行任何更改,这将离开编辑器。现在回到 vi 编辑器。使用q ex
命令并按下 return 键只有在您没有对文件进行任何更改的情况下才有效。让我们改变文件。现在,如果您想在对文件进行一些更改时离开编辑器,使用 ex 命令q
将通知您即将离开编辑器,而不保存您的更改。所以如果你想退出编辑器而不保存修改,只需输入:q!
。现在,从终端返回到服务文件。另一个非常有用的 ex 命令是在 vi 编辑器中执行命令行命令。这可以通过使用ex
命令感叹号,然后在命令行上执行您想要执行的命令来完成,例如ls
。这将切换到命令行,并向您显示结果;然后如果你按回车键,你回到编辑器。另一个非常有用的 ex 命令是sh
命令。当虚拟仪器仍在后台运行时,输入sh
作为ex
命令将切换到命令行。在这里,您可以像通常在命令行上一样执行命令。如果您已经完成了对命令行的操作,您可以通过键入exit
返回到 VIM 编辑器。
为了搜索和替换一个单词,VIM 为我们提供了一种类似集合的替换模式:
- 如果要在整个文件中用单词
hello world
替换单词echo
,请使用以下命令:
:%s/echo/HELLOWORLD/g
- 要启用行号模式,请键入
set number
。 - 要转到特定行,请在 ex 模式下键入数字行。
- 要离开号码模式,输入
set nonumber
。 - 要在 VIM 中打开不同的文件,请键入
e
,然后键入文件名。 - 要以不同的名称保存文件,请键入
w
,然后键入不同的文件名,例如my-test-file
。
在这一章中,我们已经广泛介绍了 Linux 文件系统,其中我们讨论了文件链接、文件搜索、文件权限、用户和组以及 VIM 文本编辑器。我们还研究了每个概念的功能。
在下一章中,我们将介绍如何使用命令行。