RHCSARHCE 红帽Linux认证学习指南(第7版)EX200 & EX300
上QQ阅读APP看书,第一时间看更新

认证目标3.02 标准命令行工具

虽然Linux初学者可能更喜欢使用GUI,但管理Linux系统最有效的工具还是命令行接口。虽然目前存在一些很好的GUI工具,但是这些工具的外观和操作模式随不同的发行版而异。与此相反,如果我们掌握了标准的命令行工具,则可以方便自如地操作每个Linux发行版。

记住,在任何bash会话中,我们可以利用上下方向键来浏览前面执行过的命令的历史记录,使用Ctrl+R键进行搜索。还可以利用命令自动补全功能。自动补全功能允许我们用Tab键完成命令、文件名或变量(文本需要以$字符开头)。

几乎所有的Linux命令都有开关选项和参数。命令选项允许改变命令的行为,通常前面带有一个或两个短横线(如ls -a或ls --all)。参数指定了命令应该操作的文件、设备或其他目标。本章只介绍少数几个命令。如果你对这些命令不熟悉,而可以用man文档。仔细研究命令选项,然后在Linux中进行测试。只有不断实践才会理解这些命令的强大功能。

有两组基本的命令用来管理Linux文件。一组是操作Linux文件和目录,另一组实际上可以对文件做更进一步的操作。接下来将介绍这些命令,但首先讨论基本的文件系统概念。

考试提示

本节只讨论Linux中的最基本命令,只介绍这些命令的几个最基本的功能。尽管如此,本节要求你用正确的语法执行命令,这正是RHCSA认证目标所要求的。

3.2.1 文件与目录的概念

如前所述,在Linux中任何东西都可以表示为文件。目录是特殊类型的文件,它是保存其他文件的容器。为了找到重要的文件,需要介绍一些基本的命令和概念,它们告诉你当前所在的位置以及如何从一个目录切换到另一个目录。最重要的命令是pwd命令、波浪形字符(~)和路径。使用波浪形字符(~)可以切换到用户的主目录;而路径是描述Linux目录树中位置的一个概念。与它们紧密相关的是在执行命令时搜索的目录,它与一个名为PATH的环境变量有关。掌握了这些概念后,就可以用cd命令在目录之间切换。

1. pwd命令

在命令行接口,当前目录可能是顶层目录(即为根目录,用/表示),也可能是一个子目录。pwd命令可以确定当前目录。试试这个命令,它显示一个相对于顶层根目录(/)的目录名。有了这个信息,必要时我们就可以切换到其他目录。顺便指出,pwd是打印工作目录这三个单词的首字符(print working directory)(它与现代的打印机没有任何关系,而是对把输出打印到电传打字机的时代的致敬)。例如,当用户michael在自己的主目录中执行pwd命令时,会看到下面的输出信息:

        /home/michael

2.波浪符(~)

使用标准的登录方式时,每个Linux用户都处于一个主目录中。波浪符(~)可以用来表示当前用户的主目录。例如,当用户john登录时,它处在/home/john主目录中。与此对应,root管理员用户的主目录是/root。

因此,cd ~命令的效果取决用户名。例如,如果以用户mj登录到系统,则cd ~命令导航到/home/mj目录,如果以root用户登录到系统,则此命令导航到/root目录。在目录树中任何位置都可以用ls ~命令列出自己主目录中的内容。稍后将介绍cd和ls命令的使用。当以root管理员用户登录到系统并执行ls命令,就会看到如下内容:

        anaconda-ks.cfg initial-setup-ks.cfg

顺便指出,这些文件说明在安装过程中发生的事情,即安装了哪些程序包,在本地系统添加了哪些用户和组等。anaconda-ks.cfg命令是Kickstart自动安装的重要工具,这在第2章已经讨论过。

3.目录路径

使用Linux目录时需要掌握路径的两个基本概念:绝对路径和相对路径。绝对路径是从顶层目录(即root目录/)的角度来描述完整的目录结构。相对路径是以当前目录为基础。相对路径的最前面没有斜杠。

掌握绝对目录与相对目录的区别很重要。特别当运行一个命令时,绝对目录是必需的。否则引用错误目录的命令会导致意想不到的结果。例如,假如当前在顶层root目录,我们想用相对路径备份/home目录。如果恢复该备份时我们正好在/home目录中,则michael用户的文件就会恢复到/home/home/michael目录中。

相反,如果用绝对路径备份/home目录,则在恢复这些备份文件时当前目录不起作用。备份数据会恢复到正确的目录中。

4.环境路径

严格来说,在执行一个命令时必须引用这个命令的完整路径。例如,既然ls命令是在/bin目录中,因此用户应该执行/bin/ls命令以列出当前目录中的文件。有了PATH环境变量,命令前不需要加上它的完整路径。当我们在命令行输入一个命令时,bash shell自动会在PATH环境变量的路径中搜索这个命令。从一个控制台切换到另一个控制台,环境变量始终保持不变。

为确定当前用户的PATH环境变量的内容,只需要执行echo $PATH命令。这会看到在屏幕上输出一系列目录。在RHEL 7中,普通用户的PATH变量与root用户的PATH变量的差别不大。

        $ echo $PATH
        /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:↲
        /usr/sbin:/home/michael/.local/bin:/home/michael/bin
        # echo $PATH
        /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

现在,普通用户与root用户的PATH变量包含的目录几乎完全相同,但是差别还是有的,那就是搜索目录的顺序。例如,/usr/bin和/usr/sbin这两个目录都可以使用system-config-keyboard命令。从普通用户和root管理员用户PATH变量的默认内容可以看出,由于PATH变量存在的差别,两者的执行方法不一样。

PATH是由/etc/profile文件的当前设置参数或者/etc/profile.d目录中的脚本全局决定的。你可能注意到,系统为UserID(UID)0用户与其他所有用户配置的PATH内容不大一样。UID 0对应于root管理员用户。

某个用户的PATH变量可以由该用户主目录中的一个适当的记录来加以定制,此隐藏文件名为~/.bash_profile或~/.profile。

5. cd命令

在Linux中切换目录非常容易。只要用cd并列出目标目录的绝对路径即可。如果使用相对路径,务必记住目标目录取决于当前目录。

默认情况下,单独使用cd命令可以导航到用户的主目录,该命令不需要波浪形符。另一个常用的快捷命令是两个连续的点字符(..),用于代表目录层次中的上一层目录。因此,cd..将移动到当前目录的父目录。

3.2.2 文件列表和ls命令

既然已经知道了从一个目录导航到另一个目录的命令,现在该来看看目录中有哪些文件。这就要用到ls命令。

Linux的ls命令加上合适的开关选项,是一个功能非常强大的命令。正确使用ls命令可以获得文件的全部信息,如最后修改日期、最后访问日期和文件大小等。可以按任何顺序排列文件,这对我们非常有用。ls命令的几个重要变化形式是,ls -a显示隐藏文件,ls -l长列表显示文件,ls -t按修改时间顺序排列文件,ls -i显示inode数(inode是文件系统的内部数据结构,存储了文件的信息)。其他有用的命令选项包括-r和-R。-r可颠倒排列顺序,-R可递归地列出所有子目录的内容。

开关选项可以组合使用。我们经常用ls -ltr命令,以递归和长列表的形式反序显示最近修改的文件。-d开关选项与其他选项一起可以提供当前目录的更多信息,当为ls命令提供了一个目录作为参数时,则可显示该目录的更多信息。

ls -Z命令的一个很重要的作用是返回SELinux上下文。分析图3-2中的输出结果,system_u、object_r、var_t和s0等输出信息表示这些文件的当前SELinux上下文。在RHCSA考试中(RHCE考试也一样),考生需要配置一个启用SELinux服务的系统。从第4章开始将介绍如何为系统的每个服务配置SELinux。

图3-2 当前的SELinux上下文

3.2.3 文件创建命令

有两个命令可用来创建新文件,它们是touch和cp。也可以用vi等文本编辑器创建一个新的文件。当然,尽管ln、mv和rm命令不会创建文件,但是它们确实可以用自己的方法管理文件。

1. touch命令

新建一个文件的最简单方法也许是用touch命令。例如,touch abc命令在本地目录中创建了一个名为abc的空文件。touch命令也用来改变文件的最后修改日期。例如,试试下面三个命令:

        # ls -l /etc/passwd
        # touch /etc/passwd
        # ls -l /etc/passwd

注意与每个ls -l命令的输出有关的日期和时间,并与date返回的当前日期和时间进行比较。执行了touch命令后,/etc/passwd的时间戳将更新为当前的日期和时间。

2. cp命令

cp(copy)命令允许我们把一个文件的内容复制到同名或不同名的文件中,复制得到的文件可以在任何目录。例如,cp file1 file2命令读取file1的内容,并将它保存到当前目录的file2中。使用cp命令的一个风险是它会在不提示用户的情况下很容易覆盖掉不同目录中的文件。

cp命令的另一种用途是将多个文件源复制到一个目标目录。此时,语法为cp file1 file2 ... dir。

cp命令在使用-a开关选项时支持递归修改,并保留所有文件属性,例如权限、所有权和时间戳。例如,下面的命令将把源目录中所有子目录以及相关文件复制到/mnt/backup中。

        # cp -a /home/michael/. /mnt/backup/

3. mv命令

虽然在Linux中不能重命名一个文件,但是可以移动文件。mv命令实质上是给文件贴上不同的标签。例如,mv file1 file2命令就是把file1的名字改为file2。除非把一个文件移到另一个文件系统,否则这个文件的全部内容包括索引节点数(inode number)都不会改变。mv命令也可用于目录。

4. ln命令

链接文件允许用户使用不同的名称引用同一文件。当链接文件是设备文件时,它们只代表一些较常用的名字,如/dev/cdrom。链接文件可以是硬链接,也可以是软链接。

硬链接是目录项,指向同一索引节点。它们必须在同一文件系统中创建。可以删除一个目录中的一个硬链接文件,但它还存在于另一个目录中(只有当指向文件的目录项记录数为0时,才会删除该文件,这个数字通过每个文件的计数器跟踪)。例如,下面这个命令在实际的Samba配置文件和本地目录中的smb.conf之间建立了硬链接。

        # ln /etc/samba/smb.conf smb.conf

另一方面,软链接起着重定向的作用。当我们打开一个用软链接创建的文件时,则链接把我们重定向到原来的文件。如果我们删除原来的文件,则链接就中断。虽然软链接还在使用,但它不奏效。下面这个命令说明了如何创建一个软链接文件:

        # ln -s /etc/samba/smb.conf smb.conf

5. rm命令

rm命令有点危险。Linux命令行中没有回收站。因此当我们要用rm命令删除一个文件后,就很难恢复这个文件。

rm命令也很强大。例如,当我们下载了Linux内核的源文件后,则在/root/rpmbuild/BUILD/kernel-3.10.0-123.el7目录中有几千个文件。逐一删除这些文件是不切实际的,而rm命令提供了几个功能强大的开关选项。下面这个命令可以一次性删除所有这些文件:

        # rm -rf /root/rpmbuild/BUILD/kernel-3.10.0-123.el7

-r开关选项可以按递归方式进行,-f开关选项可以覆盖掉任何安全措施,如系统为root用户创建的alias命令的输出中的-i开关。它仍然是一个十分危险的命令。例如,在下面的命令中,/ 与后面的目录名之间多了个空格。这样一个简单的输入错误就会删除自顶层根目录开始的全部文件,然后删除root/rpmbuild/BUILD/kernel-3.10.0-123.el7子目录。

        # rm -rf / root/rpmbuild/BUILD/kernel-3.10.0-123.el7

这将删除系统上的每个文件,包括所有挂载点。

6.目录创建和删除

mkdir和rmdir命令用来创建和删除目录。这两个命令的用法取决于前面讨论的绝对目录和相对路径的概念。例如,下面的命令在当前目录中创建test子目录。如果用户目前在/home/michael目录中,则完整的路径为/home/michael/test。

        # mkdir test

也可以用下面的命令创建/test目录:

        # mkdir /test

必要时可以用下面的命令创建一串目录:

        # mkdir -p test1/test2/test3

上述命令相当于以下命令:

        # mkdir test1
        # mkdir test1/test2
        # mkdir test1/test2/test3

相反,rmdir命令可以删除一个目录,条件是它必须是一个空目录。如果我们想删除前面mkdir命令创建的目录,则-p选项特别有用。下面这个命令删除前面提到的目录及其子目录,条件是这些目录必须都为空:

        # rmdir -p test1/test2/test3

7. alias命令

alias命令可用来简化几个命令。对于root用户,默认的别名可以提供一点安全性。要查看当前用户的别名,只需要运行alias命令。下面是Red Hat为root用户设置的别名列表:

        alias cp='cp -i'
        alias egrep='egrep --color=auto'
        alias fgrep='fgrep -color=auto'
        alias grep='grep --color=auto'
        alias l.='ls -d .* --color=auto'
        alias ll='ls -l --color=auto'
        alias ls='ls --color=auto'
        alias mv='mv -i'
        alias rm='rm -i'
        alias which='alias | /usr/bin/which --tty-only --read-alias ↲
        --show-dot --show-tilde'

有些alias命令可防止重要文件被误删。-i开关选项在用cp、mv或rm命令删除或覆盖掉文件之前要求用户确认。同时还要注意,-f开关选项取代这些命令的-i开关选项。

3.2.4 通配符

有时,我们可能并不知道文件的精确名字或者准确的搜索条件,此时可以使用通配符,特别是在本书介绍的命令中。三个基本的通配符如表3-1所示。

表3-1 shell中的通配符

实际经验

在Linux领域中,通配符有时也被称为文件名代换(globbing)。

3.2.5 文件搜索

大多数用户在学习Linux一段时间后就熟悉了一些重要的文件。例如,named.conf是标准DNS(Domain Name Service, DNS)服务器的关键配置文件,这些服务器基于伯克利因特网名称域(Berkeley Internet Name Domain, BIND)。但并不很多人都能记得住,包含各种有用配置信息的named.conf示例文件保存在/usr/share/doc/bind-*/sample/etc目录中。

为此,有两个基本命令可用于文件搜索:find和locate。

1. find命令

find命令在目录以及子目录中搜索所需要的文件。例如,当我们想找到DNS配置文件示例文件named.conf所在的目录,可以使用下面的命令,此命令从根目录开始搜索:

        # find / -name named.conf

但搜索的速度取决于本地系统的内存大小和磁盘速度。如果用户知道此文件位于/usr子目录树中,则可以从那个目录开始使用如下命令:

        # find /usr -name named.conf

现在这个命令就可以更快地找到所需要的文件。

2. locate命令

如果这一切还是太费时间,RHEL允许用户创建一个数据库,它保存了全部的安装文件和目录。用locate命令搜索文件几乎是即时完成的,而且locate搜索不需要完整的文件名。locate命令的缺点是此数据库通常每天只更新一次,这在/etc/cron.daily/mlocate脚本文件中有记录。

每24个小时才更新一次可能不够,特别是在两个半小时的考试期间。幸运的是,前面提到的这个脚本文件可以直接由root管理用户从命令行接口中执行。只需要输入这个文件的完整目录就行,就像它是一个命令一样:

        # /etc/cron.daily/mlocate