在Linux系统中,几乎每一个能够直接处理的对象都是一个文件,并且它们经常都是文本文件。例如,Linux系统中的所有配置文件都是文本文件。因此,要想对一个应用进行重新配置,你可以直接打开配置文件,修改文本,保存文件,然后重新启动应用——重新配置操作就完成了。
既然系统中存在如此众多的文本文件,那么在管理Linux系统和应用的过程中,文本操作就显得尤为关键。在本章中,你将学习在Linux系统中使用若干命令和技术来对文本进行操作。
出于演示讲解的目的,我们将用到世界上最好的网络入侵检测系统(NIDS)Snort中的一些文件,该系统最早由Marty Roesch开发,目前为思科公司所有。NIDS通常被用于检测黑客入侵,因此如果你想要成为一名成功的渗透测试人员,那么就必须对NIDS防御攻击的方式,以及对其入侵以规避检测的方式有所了解。
注意
如果你正在使用的Kali Linux系统版本并没有预安装Snort系统,那么可以通过输入apt-get install snort来从Kali软件仓库下载文件。
如第1章所述,最基本的文本显示命令或许就是cat,但它有一定的限制。可使用cat命令来显示在/etc/snort中找到的Snort配置文件(snort.conf),如代码清单2-1所示。
代码清单2-1 在终端窗口中显示snort.conf
你的屏幕现在应该显示了整个snort.conf文件,它将一直滚动至文件的结尾(如下所示);就查看和处理这个文件而言,这并不是最方便或实用的方式。
在接下来的两个小节中,我将为你展示head和tail命令,它们是两种只显示一个文件的部分内容,从而方便你查看关键内容的方法。
如果想要查看一个文件的开头部分,那么你可以使用head命令。默认情况下,该命令会显示一个文件的前10行内容。例如,以下命令将为你显示snort.conf文件的前10行:
如果想要查看多于或少于默认10行的信息,那么可以在head命令和文件名称之间输入连字符(-)选项并加上想要的数量。例如,如果想要查看文件的前20行内容,那么你可以输入如代码清单2-2顶端所示的命令。
代码清单2-2 在终端窗口中显示snort.conf的前20行内容
你应该只能看到snort.conf的前20行内容显示在终端窗口中。
tail命令与head命令相似,但它是用于查看一个文件的倒数几行。我们针对snort.conf文件使用该命令:
我们注意到,该命令显示了最后几行包含规则文件的内容,而不是全部,因为与head命令类似,tail命令同样默认显示10行。你可以通过抓取snort.conf的最后20行来显示更多行的内容。与head命令相同,你可以通过在命令和文件名称之间输入一个连字符(-)后接行数,来通知tail命令要显示的行数,如代码清单2-3所示。
代码清单2-3 在终端窗口中显示snort.conf的最后20行内容
现在,我们可以在屏幕上看到包含规则文件的几乎所有行内容。
有时——特别是对很长的文件来说——我们可能想要显示行号。由于snort.conf有超过600行内容,因此行号在这里会很有用。它能够使查看文件的更改内容以及返回同一位置变得更为容易。
要以带行号的形式来显示一个文件,我们可以使用nl(number line)命令。直接输入如代码清单2-4所示的命令。
代码清单2-4 在终端输出中显示行号
每行都有一个编号,这就使查阅变得更为容易。
grep命令可能是使用得最为广泛的文本操作命令。你可以利用该命令对文件显示的内容进行过滤。例如,如果想要查看snort.conf文件中所有包含单词output的行,那么你可以使用cat命令,并要求其只显示这些行(如代码清单2-5所示)。
代码清单2-5 显示包含由grep命令指定的关键字或短语实例的行
该命令将首先查看snort.conf,然后使用管道(|)将其内容发送给grep命令,后者将该文件视为输入,查找单词output出现的行,并且仅显示这些行。对于在Linux系统中进行操作来说,grep命令是一条非常强大而必要的命令,因为它可以为你节省在一个文件中搜索一个单词或命令每次出现的位置所花费的几个小时时间。
挑战:使用grep、nl、tail和head命令
假设你想利用刚刚学到的至少四条命令来显示包含内容# Step #6: Configure output plugins的一行之前倒数五行的内容。你应该怎么做?(提示:关于这些命令我们还有很多选项未曾讨论。你可以利用Linux系统内建命令man来学习更多的命令。例如,man tail将展示tail命令的帮助文件。)
有很多种方法能够完成这次挑战。在此,我将为你演示其中一种方法,以便修改某些行从而实现相关操作,而你的任务则是寻找另一种方法。
第1步
我们可以看到,包含内容# Step #6: Configure output plugins的行是第512行,而我们知道自己想要的是第512行之前倒数5行以及第512行本身(即第507~512行)。
第2步
在这里,我们利用tail命令抓取从第507行开始到文件结尾的内容,然后将其输出到head命令中,从而实现仅返回起始6行,这就给出了包含内容# Step #6: Configure output plugins的行之前的倒数5行,以及该行本身。