在熟悉Linux系统之前,寻找路径可能会让你感到非常困惑,但是关于一些基本命令和技术的知识,能够帮助你朝着使命令行更友好这一目标前进一大步。以下命令能够帮助你在终端中定位对象。
或许最简单的可用命令就是locate。通过在后面接上一个代表待查找对象的关键字,该命令将遍历整个文件系统,并且定位该单词出现的每一个位置。
例如,要查找aircrack-ng,请尝试如下输入:
然而,locate命令并不是完美的。有时locate命令的结果可能会非常多,从而给你太多的信息。同时,locate命令所用的数据库通常每天只更新一次,因此如果在几分钟或几小时之前刚创建了一个文件,那么它可能要到次日才会出现在查询结果中。我们需要对这些基本命令的缺点多加注意,这样你才能更好地确定使用每个命令的最佳时机。
如果想要查找一个二进制文件,那么你可以使用whereis命令来对其进行定位。该命令不仅会返回二进制程序的位置,而且在可用的情况下还会显示其源文件和参考页面。示例如下:
在这种情况下,whereis命令只返回了aircrack-ng二进制程序和参考页面,而不是单词aircrack-ng出现的每一个位置。这样的结果效率更高而且更有启发性,你不这么觉得吗?
which命令更具针对性:它只返回二进制程序在Linux系统PATH变量中的位置。我们将在第7章更详细地介绍PATH变量,而就目前来说,只需要知道PATH保存了操作系统查找你在命令行执行的命令时所用到的目录就足够了。例如,当我在命令行输入aircrack-ng时,操作系统利用PATH变量来查看应该在哪个目录下查找aircrack-ng:
在这里,which命令能够在PATH变量所列的目录中找到一个单独的二进制文件。至少,这些目录通常都会包括/usr/bin,甚至也有可能包括/usr/sbin和其他一些目录。
find命令是非常强大而灵活的搜索工具。它能够在任何指定目录中进行搜索,并查找众多不同的参数,其中当然包括文件名称,还包括创建或修改日期、所有者、群组、权限以及大小。
以下是find命令的基本用法:
因此,如果想要从根目录开始搜索一个名为apache2(开源网络服务器)的文件,那么应该进行如下输入:
首先声明要开始搜索的目录,在本例中是/➊。然后,指明待搜索文件的类型,在本例中f代表一个常规文件➋。最后,给定要搜索的文件名称,在本例中是apache2➌。
本次搜索的结果如下所示:
find命令从文件系统的顶端(/)开始,遍历每个目录来查找apache2这一文件名,然后列举查找到的所有实例。
可以想象,一次遍历每个目录的搜索肯定会很慢。一种加速的方法是,只在预计能够找到所需文件的目录中进行遍历。在这种情况下,如果想要寻找一个配置文件,那么我们可以直接在/etc目录中进行搜索,这样Linux系统只会搜索其子目录。让我们来试一试:
这次明显更快的搜索只会在/etc目录及其子目录中查找apache2出现的位置。还要特别注意的是,与其他一些搜索命令不同,find命令只显示与名称严格匹配的结果。如果文件apache2有一个后缀,比如说apache.conf,那么搜索过程将不会发现一个匹配结果。我们可以通过使用通配符来突破这种限制,从而匹配多个字符。通配符主要有三种不同的形式:*、?和[]。
让我们在/etc目录中查找所有以apache2开头、带有任意后缀的文件。对此,我们可以编写一条使用如下通配符的find命令:
当这条命令运行时,我们在/etc目录中发现只有一个文件符合apache2.*的模式。当我们使用点号后跟一个*通配符时,终端会寻找在文件名apache2后带有任何后缀的文件。对于查找不知道后缀的文件,这是一种非常有用的技术。
当这条命令运行时,我在/etc目录中找到两个以apache2开头的文件,其中包括apache2.conf文件。
假设我们正在一个包含文件cat、hat、what和bat的目录中进行搜索。通配符?被用来代表一个单独的字符,因此针对?at的搜索结果将返回hat、cat和bat,而不包括what,因为在该文件名中的at之前存在两个字母。通配符[]用于匹配出现在中括号内的字符。例如,针对[c,b]at的搜索结果将匹配cat和bat,而并不包括hat和what。使用最为广泛的通配符是星号(*),它将匹配任意长度的任意字符,包括从零到无限长度的字符。例如,针对*at的搜索结果将返回cat、hat、what和bat。
在使用命令行的时候,你经常需要查找一个特定的关键字;对此,可以使用grep命令作为过滤器来查找关键字。
grep命令经常在一条命令的执行结果通过管道传输给另一条命令时使用。我会在第2章介绍管道,但就目前来说,知道Linux系统(以及Windows系统在类似的情况下)允许我们将一条命令的输出作为输入发送给另一条命令就足够了。这就叫作管道传输,我们可以利用|命令来完成这种操作(在键盘上,|键通常是在回车键的上方)。
ps命令用于显示主机上正在运行的进程的相关信息。我们将在第6章对其进行详细讲解,但就本例而言,假设我想要查看Linux系统上正在运行的所有进程。在这种情况下,我可以使用ps(processes)命令后跟aux选项来指定要显示的进程信息类型,如下所示:
这样就提供了一个系统中所有正在运行的进程的列表——但如果我只想查找一个进程以确定它是否正在运行,那么怎么办?
我可以通过将ps命令的输出利用管道传输给grep命令,进而搜索关键字来实现。比如,要查看apache2服务是否正在运行,我可以输入如下内容:
这条命令通知Linux系统显示所有服务,然后将输出发送给grep命令,该命令将遍历输出信息来查找关键字apache2,之后只显示相关输出,这就为我节省了可观的时间并保护了我的视力。