bash网络安全运维(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-07 06:24:57

点击下载

作者:(美)保罗·特龙科恩(Paul Troncone),(美)卡尔·阿尔宾(Carl Albing)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

bash网络安全运维

bash网络安全运维试读:

前言

兵之情主速。——孙武,《孙子兵法》

在当今时代,命令行有时会被忽略。新的网络安全从业人员可能会被具有华丽图形界面的工具所吸引。经验丰富的运维人员可能会忽视或低估命令行的价值。然而,命令行有着丰富的功能,应该成为每个实践者工具包的一部分。例如,看似简单的输出指定文件最后几行数据的tail命令超过了2000行C代码。你当然可以使用Python或其他编程语言创建类似的工具,但是当你从命令行通过简单的调用就可以实现其功能时,为什么要那样做呢?

此外,学习如何在复杂任务中使用命令行可以让你更好地理解操作系统的工作方式。最有能力的网络安全从业人员了解工具在基础原理层面上如何工作,而不仅仅是如何使用它们。

本书将教你如何均衡使用复杂的Linux命令和bash shell来增强你作为安全运维员和实践者的能力。通过学习这些技能,你将能够通过一行简单的管道命令快速地创建和原型化复杂的功能。

尽管bash shell和我们在本书中讨论的命令最初是在Unix和Linux操作系统家族中提出的,但是现在它们已经无处不在了。这些技术很容易在Linux、Windows和macOS环境之间迁移。本书的读者对象

本书是为那些希望在计算机安全语境下掌握命令行的人编写的。我们的目标不是用命令行脚本替换现有的工具,而是教你如何使用命令行,以便你可以利用它来增强现有的安全功能。

在本书中,我们将重点放在诸如数据收集、数据分析和渗透测试这些安全技术的示例上。这些示例的目的是展示命令行功能,并让你深入了解高级工具使用的一些基本技术。

本书假定读者基本熟悉网络安全、命令行界面、编程概念,以及Linux和Windows操作系统。事先对bash有所了解是有用的,但不是必需的。

本书并不是介绍编程的,尽管在本书第一部分涉及了一些编程的基本概念。Bash或bash

在本书中,除非指的是Windows程序Git Bash,否则我们均使用bash(首字母小写)来指bash shell。这个约定也是沿袭了Chet Ramey的建议,他是bash软件的当前维护者。有关bash的更多信息,请访问bash网站(http://bit.ly/2I0ZqzU);有关各种bash发布版本、参考文档和示例的更多信息,请访问bash手册的维基网页(http://bit.ly/2FCjMwi)。脚本的鲁棒性

本书中的示例脚本用于说明和传授概念。这些脚本的设计不够高效或鲁棒,因此不适合企业部署。如果选择在生产环境中使用这些脚本,一定要谨慎。请确保遵循编程最佳实践来进行bash脚本的编写,并在正式部署之前进行充分的测试。练习题

我们在每章的末尾提供了一些思考题和练习题,以帮助你学习安全性、命令行和bash技巧等方面的知识。你可以在本书配套网站上找到这些练习题的答案和其他资源,网址为https://www.rapidcyberops.com。本书中使用的约定

本书使用以下排版约定:

斜体(Italic)

表示URL、电子邮件地址、文件名和文件扩展名。

等宽字体(Constant width)

用于程序清单,以及在段落中用于程序元素,如变量、函数名、数据库、数据类型、环境变量、注释说明和关键字。

等宽粗体(Constant width bold)

表示命令或者其他需要用户按照字面要求输入的文本。

等宽斜体(Constant width italic)

表示应该以用户提供的值或由上下文得到的值进行替换的文本。此元素表示提示或建议。此元素表示一般说明。此元素表示警告。使用代码示例

本书是用来帮你完成工作的。一般来说,你可以在程序和文档中使用本书提供的示例代码。你不需要得到我们的许可,除非你基于我们提供的大部分代码进行了再生产。例如,编写使用本书中几个代码块的程序不需要获得许可,出售或发布O’Reilly图书中的示例光盘则需要获得许可。通过引用本书和引用示例代码来回答问题不需要获得许可,将本书中的大量示例代码集成到你的产品文档中则需要获得许可。

我们重视但不要求注明版权归属。版权归属通常包括书名、作者、出版商和ISBN。例如:“Cybersecurity Ops with bash by Paul Troncone and Carl Albing(O’Reilly).Copyright 2019 Digadel Corp & Carl Albing,978-1-492-04131-3.”

如果你觉得自己对代码示例的使用超出了合理使用或上面给出的许可范围,请通过permissions@oreilly.com与我们联系。O’Reilly在线学习近40年来,O’Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。

我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。如何联系我们

对于本书如果有任何意见或疑问,请按照以下地址联系本书出版商。

美国:

O’Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

我们为这本书提供了一个网页,其中列出了勘误、示例和其他信息。你可以通过http://bit.ly/cybersecurity-ops-bash访问此页面。

要对本书进行评论或提出技术问题,请发送电子邮件至bookquestions@oreilly.com。

有关我们的书籍、课程、会议和新闻的更多信息,请访问我们的网站http://www.oreilly.com。

我们在Facebook上的网页:http://facebook.com/oreilly

我们在Twitter上的网页:http://twitter.com/oreillymedia

我们在YouTube上的网页:http://www.youtube.com/oreillymedia致谢

我们要感谢两个主要的技术审稿人,他们的洞察力帮助我们确保了本书的准确性和对读者的最大价值。Tony Lee,Cylance有限公司的高级技术总监,一名安全爱好者,主要在LinkedIn和SecuritySynapse网站上分享自己的知识。Chet Ramey,凯斯西储大学信息技术服务部的高级技术架构师,是bash当前的软件维护者。

感谢Bill Cooper、Josiah Dykstra、Ric Messier、Cameron Newham、Sandra Schiavo和JP Vossen的指导与评审。

最后,我们要感谢O’Reilly的整个团队,特别是Nan Barber、John Devins、Mike Loukides、Sharon Wilkey、Ellen Troutman-Zaig、Christina Edwards和Virginia Wilson。免责声明

本书所表达的观点仅仅是作者自己的观点,并不代表美国政府的观点。第一部分 基础

工欲善其事,必先利其器。——佚名

在第一部分中,我们首先介绍命令行、bash shell和正则表达式,并回顾网络安全的基本原则。第1章 命令行入门

计算机的命令行界面使你与其操作系统(OS)建立起一个紧密的连接。在操作系统中存在着数量惊人的功能——经过几十年的使用和开发,这些功能得到了打磨和完善。遗憾的是,使用命令行与操作系统交互的能力正在迅速成为一门失传的艺术。取而代之的是图形用户界面(GUI),它常常以牺牲速度和灵活性为代价,增加易用性,并使用户远离底层功能。

有效使用命令行是安全研究员和管理员的一项重要技能,业界的许多工具,如Metasploit、Nmap和Snort,只需熟练地使用命令行即可使用。在渗透测试期间,特别是早期阶段,你与目标系统交互时唯一的选择是使用命令行界面。

为了建立一个坚实的基础,我们将首先概述命令行及其组件,然后,我们将研究如何应用它来增强你的网络安全技术能力。1.1 命令行定义

在本书中,命令行一词用于指所有安装在操作系统上的各种非GUI可执行程序,特别是shell的命令行界面提供的内建指令、关键字和脚本功能。

要有效地利用命令行,你需要做两件事:1)了解现有命令的特性和选项;2)了解通过脚本语言将命令组合在一起的方法。

在这本书中,我们将介绍Linux和Windows操作系统的40多个命令,以及各种各样的shell内建指令和关键字,引入的大多数命令都源自Linux环境,但在Windows平台上也可以有多种方法运行这些命令。1.2 为什么选择bash

为了便于编写脚本,我们选择bash shell和命令语言。bash shell已经存在了几十年,几乎可以在Linux的每个版本中使用,甚至已经渗透到Windows操作系统中。这使得bash成为安全运维的理想技术,因为这些技术和脚本都是跨平台的。bash的广泛性也给渗透测试人员带来了特别的优势,因为在许多情况下,不需要在目标系统上安装额外的解释器和依赖包。1.3 命令行示例

本书的许多例子大量使用了命令行,单行命令示例如下:ls -l

如果需要显示上面的命令示例的输出,那么,它将看起来如下所示:$ ls -l-rw-rw-r-- 1 dave dave 15 Jun 29 13:49 hashfilea.txt-rwxrw-r-- 1 dave dave 627 Jun 29 13:50 hashsearch.sh

注意在包含输出的示例中使用了$字符。$字符不是命令的一部分,而是用来表示shell命令行的简单提示符。这个字符帮助你区分命令(就是你将要输入的内容)和终端上显示的输出结果。在这个示例中,当你运行命令时,将命令与其输出分隔开的空行并不会出现。再次申明,增加的空行仅仅是用于区分命令和命令的输出结果,更便于阅读而已。

Windows命令示例要使用Git Bash运行,除非特别声明,否则不会出现Windows命令提示符。1.4 在Windows上运行Linux和bash

bash shell和我们讨论的命令默认安装在几乎所有的Linux发行版上。但是对于Windows环境则不是这样。幸运的是,有很多在Windows系统上运行Linux命令和bash脚本的方法。我们在这里介绍的四个例子是Git Bash、Cygwin、Linux版Windows子系统、Windows命令提示符及PowerShell。1.4.1 Git Bash

如果你安装了Git,并包含了bash的端口服务,你就可以在Windows环境中运行许多标准的Linux命令和bash shell。Git Bash是本书中给出的示例的首选运行环境,因为它很受欢迎,并且能够运行标准的Linux和bash命令,也能够调用许多Windows本机命令。

你可以从Git网站下载Git。安装好之后,你可以在桌面上或文件夹中单击右键,并选择Git Bash来运行bash。1.4.2 Cygwin

Cygwin是一个功能齐全的Linux模拟器,它可以安装多种包。它与Git Bash类似,除了标准的Linux命令之外,它也允许调用许多Windows本机命令。Cygwin可以从Cygwin项目网站https://www.cygwin.com下载。1.4.3 Linux版Windows子系统

安装了Linux版Windows子系统(Windows Subsystem for Linux,WSL)模块后,Windows 10就可以直接运行Linux。要安装WSL,请遵循以下步骤:

1.单击Windows 10搜索框。

2.搜索控制面板。

3.单击程序和功能。

4.点击“打开或关闭Windows功能”。

5.选择“Linux版Windows子系统”复选框。

6.重新启动系统。

7.打开Windows商店。

8.搜索Ubuntu并安装它。

9.安装Ubuntu之后,打开Windows命令提示符并输入ubuntu。

注意,当以这种方式使用WSL Linux发行版时,你可以运行bash脚本并挂载Windows文件系统,但是不能像使用Git Bash和Cygwin那样对Windows本机命令进行系统调用。一旦安装了WSL之后,你也可以通过访问Windows商店选择安装Ubuntu之外的其他Linux版本,比如Kali。1.4.4 Windows命令提示符及PowerShell

安装了Linux版Windows子系统之后,就可以通过使用bash-c命令直接从Windows命令提示符及PowerShell运行Linux命令和bash脚本。

例如,你可以从Windows命令提示符在当前工作目录运行Linux pwd命令:C:\Users\Paul\Desktop>bash -c "pwd"/mnt/c/Users/Paul/Desktop

如果多个Linux发行版已经作为WSL的一部分被安装,在调用命令时,可以使用发行版名称代替bash:C:\Users\Paul\Desktop>ubuntu -c "pwd"/mnt/c/Users/Paul/Desktop

还可以使用此方法执行安装在WSL Linux发行版中的包,这些包具有命令行接口,比如Nmap。

这个看似微不足道的新增功能使你能够从Windows命令提示符、批处理脚本和PowerShell脚本中利用Linux命令、包和bash功能的整个库。1.5 命令行基础

命令行是一个通用术语,它指的是在GUI发明之前向交互式计算机系统发出命令的方法。在Linux系统上,它是bash(或其他)shell的输入。bash的基本操作之一是执行命令,即运行另一个程序。当命令行出现几个单词时,bash假设第一个单词是要运行的程序的名称,其余的单词是命令的参数。例如,要让bash运行名为mkdir的命令并传递两个参数-p和/tmp/scratch/garble,你需要输入以下命令:mkdir -p /tmp/scratch/garble

按照惯例,程序将选项放在前面,并以一个前导-开始,就像这里的-p选项一样。上面的命令被告知创建一个名为/tmp/scratch/garble的目录。-p选项指示用户对特定行为的选择——即不会报告错误,并且会根据需要创建(或尝试创建)任何中间目录(例如,如果只有/tmp存在,那么mkdir将首先创建/tmp/scratch,然后再尝试创建/tmp/scratch/garble)。1.5.1 命令、参数、内建指令和关键字

可以运行的命令是文件、内建指令或关键字。

文件是可执行程序,它们可能是编译过程的结果文件,并由机器指令组成。ls程序就是一个例子。你可以在大多数Linux文件系统/bin/ls目录中找到该文件。

另一种类型的文件是脚本,一种人类可读的文本文件,文件由一种解释语言撰写而成,系统可以通过语言解释器运行这些语言。这些脚本语言有bash、Python和Perl等,这里仅举几个例子。我们将在后面的章节中创建一些脚本(用bash编写)。

内建指令是shell的一部分。它们看起来像可执行文件,但是文件系统中没有加载和执行文件来执行它们。相反,它们是作为shell层的一部分完成的。一个简单的例子就是pwd命令。使用内建指令会更快更有效。类似地,你可以在shell中定义函数,这些函数将像内建指令一样被使用。

还有其他一些单词看起来像命令,但实际上只是shell语言的一部分。if就是一个例子。它通常被用作命令行上的第一个单词,但它不是文件,而是一个关键字。它的语法可能比命令行中典型的command-oplions arguments格式更为复杂。我们将在下一章简要介绍其中的一些关键字。

你可以使用type命令来识别一个单词是关键字、内建指令、命令,还是什么都不是。-t选项将输出保持为一个单词:$ type -t ifkeyword$ type -t pwdbuiltin$ type -t lsfile

你可以使用compgen命令来确定哪些命令、内建指令和关键字对你可用。使用-c选项列出命令,-b选项列出内建指令,-k选项列出关键字:$ compgen -kifthenelseelif...

如果这个区别在这一点上看起来令人困惑,不要担心。你一般不需要知道它们之间的区别,但你应该意识到使用内建指令和关键字比命令(外部文件中的可执行文件)要高效得多,尤其是在循环中反复调用时。1.5.2 标准输入/输出/错误

在操作系统术语中,正在运行的程序称为进程。Unix/Linux/POSIX(包括Windows)环境中的每个进程都有三个不同的输入/输出文件描述符。这三个被称为标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。

顾名思义,stdin是程序的默认输入源——默认情况下,字符来自键盘。当你的脚本从stdin中读取时,它正在读取键盘上键入的字符,或者(你将很快看到)可以将其更改为从文件中读取。stdout是发送程序输出的默认位置。默认情况下,输出出现在运行shell或shell脚本的窗口中。标准错误也可以从程序中发送到输出,但它应该只输出到程序中编写错误消息的地方。将任何输出直接发送到stdout或stderr都取决于编写程序的人员。所以在编写脚本时一定要小心,最好不要将错误消息发送到stdout,而是要发送到stderr。1.5.3 重定向和管道

shell的一大创新之处在于,它提供了一种机制,你可以让一个正在运行的程序在不修改程序本身的情况下更改它的输入位置和输出位置。如果你有一个名为handywork的程序,它从stdin读取输入并将结果写入stdout,你可以简单地更改它的行为如下所示:handywork < data.in > results.out

这将运行handywork,但输入将不是来自键盘,而是来自名为data.in的数据文件(假设存在这样一个文件并以我们想要的格式输入)。类似地,输出不是发送到屏幕,而是发送到名为results.out的文件中(如果不存在,则创建results.out;如果存在,则覆盖results.out)。这种技术称为重定向,因为我们将输入重定向为来自不同的地方,并将输出重定向到除屏幕之外的其他地方。

stderr呢?其语法类似。当重定向来自程序之外的数据时,我们必须区分stdout和stderr,我们通过使用文件描述符数字来进行这种区分。stdin是文件描述符0,stdout是文件描述符1,stderr是文件描述符2,所以我们可以这样重定向错误消息:handywork 2> err.msgs

这只重定向stderr,并将任何此类错误消息输出发送到我们称为err.msgs的文件(原因显而易见)。

当然,我们可以在同一命令行上做这三件事:handywork < data.in > results.out 2> err.msgs

有时,我们希望将错误消息与正常输出组合在一起(就像在缺省情况下,将两者都写到屏幕上时那样)。我们可以通过以下语法来实现:handywork < data.in > results.out 2>&1

这意味着将stderr(2)发送到与文件描述符1(&1)相同的位置。注意,如果没有&符号,错误消息将被发送到一个名为1的文件。这种stdout和stderr的结合是如此常见,以至于有一个有用的缩写符号:handywork < data.in &> results.out

如果你想丢弃标准输出,可以将其重定向到一个特殊的文件/dev/null,如下所示:handywork < data.in > /dev/null

要查看命令行上的输出并同时将相同的输出重定向到文件,请使用tee命令。下面显示的是handywork的输出,并保存到results.out:handywork < data.in | tee results.out

使用tee命令上的-a选项将其附加到输出文件中,而不是覆盖写入。|字符被称为管道。它允许你从一个命令或脚本获取输出,并将其作为输入提供给另一个命令。在本例中,handywork的输出通过管道输入到tee命令中进行进一步处理。

当使用单个大于号重定向输出时,文件将被创建并可能会被截断(也就是,内容会有丢失)。如果你想保存文件中的现有内容,你可以使用双大于号来附加文件,如下所示:handywork < data.in >> results.out

这将执行handywork,然后将stdout的任何输出附加到文件results.out中,而不会覆盖其现有内容。

类似地,命令行handywork < data.in &>> results.out

执行handywork,然后将stdout和stderr都附加到文件results.out中,而不会覆盖其现有内容。1.5.4 在后台运行命令

在本书中,我们将超越单行命令,构建复杂的脚本。其中一些脚本可能需要大量的时间来执行,以至于你可能不想花时间等待它们完成。为此,你可以使用&操作符在后台运行任何命令或脚本。脚本将继续运行,但是你可以继续使用shell发出其他命令和运行其他脚本。例如,要在后台运行ping并将标准输出重定向到文件,可以使用以下命令:ping 192.168.10.56 > ping.log &

在将任务发送到后台时,你可能希望将标准输出和标准错误重定向到文件,或者该任务将继续打印到屏幕并中断你正在执行的其他活动:ping 192.168.10.56 &> ping.log &注意不要混淆&(用于将任务发送到后台)和&>(用于执行标准输出和标准错误的组合重定向)。

你可以使用jobs命令列出当前在后台运行的所有任务:$ jobs[1]+ Running ping 192.168.10.56 > ping.log &

使用fg命令和相应的任务编号,将任务带回到前台:$ fg 1ping 192.168.10.56 > ping.log

如果任务当前在前台执行,可以按下Ctrl+Z组合键暂停进程,然后使用bg在后台继续进程。在这里,你可以使用前面描述的jobs和fg。1.5.5 从命令行到脚本

一个shell脚本只是一个包含你可以在命令行中键入的相同命令的文件。将一个或多个命令放入一个文件中,就会得到一个shell脚本。如果你把你的脚本文件叫作myscript,你可以通过键入bash myscript来运行该脚本,或者你可以给它执行权限(例如,chmod 755 myscript),然后你可以直接调用它来运行脚本./myscript。我们通常会在脚本文件的第一行包含以下内容,告诉操作系统我们使用的是哪种脚本语言:#!/bin/bash -

当然,这假定bash位于/bin目录中。如果希望脚本具有更好的移植性,可以使用以下方法:#!/usr/bin/env bash

它使用env命令来查找bash的位置,并被认为是解决可移植性问题的标准方法。同样地,它假定env命令可以在/usr/bin中找到。1.6 总结

命令行类似于一个物理的多工具箱。如果你需要把螺丝钉入一块木头,最好的选择是一个专业的工具,如手动螺丝刀或电动螺丝刀。然而,如果你被困在资源有限的树林中,那么没有什么比多用工具箱更好的了。你可以用它把螺丝钉进一块木头里,剪断一段绳子,甚至打开一个瓶子。命令行也是这样:它的价值不在于它能多好地执行一个特定的任务,而在于它的命令全面和随时可用。

近年来,bash shell和Linux命令变得无处不在。通过使用Git Bash或Cygwin,你可以轻松地在Windows环境中使用这些功能。为获得更多的功能,你也可以安装Linux版Windows子系统,它使你在Windows环境下能够运行完整版的Linux操作系统,并直接从Windows命令提示符及PowerShell使用这些功能。

在下一章中,我们将讨论脚本编写的强大功能,它能够重复运行命令、做出决策和针对不同的输入进行循环处理。1.7 练习题

1.编写一个命令,执行ifconfig并将标准输出重定向到名为ipaddress.txt的文件中。

2.编写一个命令,执行ifconfig并将标准输出重定向附加到名为ipaddress.txt的文件中。

3.编写一个命令,将目录/etc/a中的所有文件复制到目录/etc/b,并将标准错误重定向到文件copyerror.log。

4.编写一个命令,在根文件目录上执行目录列表命令(ls),并将输出通过管道输入到more命令。

5.编写一个命令,执行mytask.sh并将其发送到后台。

6.给定以下任务列表,编写一个命令,将Amazon ping任务带到前台:[1] Running ping www.google.com > /dev/null &[2]- Running ping www.amazon.com > /dev/null &[3]+ Running ping www.oreilly.com > /dev/null &

访问本书配套网站获得更多的资源和这些问题的答案。

在kindle搜索B088BNKV3M可直接购买阅读第2章 bash入门

bash不仅仅是一个运行程序的简单命令行界面。它本身就是一种编程语言。它的默认操作是启动其他程序。如前所述,当命令行上出现几个单词时,bash假设第一个单词是要启动的程序的名称,其余的单词是要传递给该程序的参数。

但是作为一种编程语言,bash还具有支持输入和输出、控制结构(例如,if、while、for、case)等更多的特性。它的基本数据类型是字符串(如文件名和路径名),但它也支持整数。因为它的重点是脚本和启动程序,而不是数值计算,所以它并不直接支持浮点数,尽管可以通过使用其他命令来实现这一点。下面简要介绍一下bash的一些特性,正是这些特性使bash成为一种尤其适用于脚本编写的功能强大的编程语言。2.1 输出

与所有编程语言一样,bash能够向屏幕输出信息。可以使用echo命令实现信息输出:$ echo "Hello World"Hello World

你也可以使用printf内建指令,该指令允许带格式输出:$ printf "Hello World\n"Hello World

第1章已经介绍了如何将输出重定向到文件或stderr,或者通过管道重定向到另一个命令,在后面的章节中你将看到更多这样的指令及其选项。2.2 变量

bash变量以一个字母或下划线开头,后跟字母或数字。除非另有声明,否则它们默认是字符串类型的变量。给变量赋值,你可以这样写:MYVAR=textforavalue

要提取变量的值——例如,使用echo命令打印出该值,你可以在变量名前面使用$,如下所示:echo $MYVAR

如果你想要给变量分配一个单词串,也就是说,要保留其中的所有空格,请在该值周围使用引号,如下所示:MYVAR='here is a longer set of words'OTHRV="either double or single quotes will work"

使用双引号将允许字符串内部出现其他变量的替换。例如:firstvar=beginningsecondvr="this is just the $firstvar"echo $secondvr

输出的结果是:this is just the beginning

当提取变量的值时,可能会使用很多种变量的替换;我们将在之后的脚本中使用并显示它们。请记住,使用双引号(")时,以$开头的所有替换都会被执行,而在单引号(')中则不会执行任何类型的替换。

你还可以使用$()存储shell命令的输出,如下所示:CMDOUT=$(pwd)

它在子shell中执行命令pwd,不是将结果打印到stdout,而是将命令的输出存储在变量CMDOUT中。你还可以在$()中通过管道组合多个命令。位置参数

当使用命令行工具时,通过使用参数将数据传递到命令中是很常见的。每个参数由空格字符分隔,并在bash中使用一组特殊的标识符进行访问。在bash脚本中,可以使用$1访问传递给脚本的第一个参数,使用$2访问第二个参数,以此类推。$0是一个特殊的参数,它保存脚本的名称,而$#返回参数的总数。请看例2-1中的脚本:

例2-1:echoparams.sh#!/bin/bash -## Cybersecurity Ops with bash# echoparams.sh## Description:# Demonstrates accessing parameters in bash## Usage:# ./echoparms.sh #echo $#echo $0echo $1echo $2echo $3

这个脚本首先输出参数的数量($#),然后输出脚本的名称($0),再输出前三个参数。脚本的输出如下:$ ./echoparams.sh bash is fun3./echoparams.shbashisfun2.3 输入

在bash中是通过read命令接收用户输入的。read命令从stdin获取用户输入并将其存储在指定的变量中。下面的脚本将用户输入读入到MYVAR变量中,然后将其打印到屏幕上:read MYVARecho "$MYVAR"

第1章已经介绍了如何将输入重定向为来自于文件。在后面的章节中,你将看到更多有关read及其选项,以及这种重定向的描述。2.4 条件语句

bash有各种各样的条件语句。它们大多(但不是全部)以关键字if开头。

你在bash中调用的任何命令或程序都可能产生输出,但它总是会返回一个成功或失败的值。在shell中,这个值可以在命令运行后立即从变量$?中获得。返回值0表示命令执行的结果是“成功”或“正确”;任何非零值都被认为命令执行的结果是“失败”或“错误”。if语句最简单的形式就是基于这个事实进行判断,其形式如下:if cmdthen some cmdselse other cmdsfi使用0表示真,使用非零表示假,这与许多编程语言(如C++、Java、Python等)完全相反。但是对于bash是有意义的,因为一个失败的程序应该返回一个错误代码(解释它是如何失败的),而一个成功的程序应该没有错误代码,即0。这反映了这样一个事实:如果成功,许多操作系统调用返回0;如果发生错误,返回-1(或其他非零值)。但是在bash中,对于双括号内的值有一个例外(稍后将详细介绍)。

例如,下面的脚本尝试将目录更改为/tmp。如果该命令成功(返回0),则执行if语句的主体。if cd /tmpthen echo "here is what is in /tmp:" ls -lfi

bash甚至可以以类似的方式处理命令管道:if ls | grep pdfthen echo "found one or more pdf files here"else echo "no pdf files found"fi

对于管道,管道中最后一个命令的成功或失败决定了是否采用“true”分支。下面是一个反映这个事实的例子:ls | grep pdf | wc

即使grep命令没有找到pdf字符串,这一系列命令也是“true”。这是因为wc命令(列出输入的单词数)将成功并打印如下内容:0  0  0

当没有来自grep命令的输出时,该输出指示零行、零单词和零字节(字符)。对于wc来说,这仍然是一个成功的结果(因此是正确的),而不是一个错误或失败的结果。它计算的行数和给定的行数一样多,即使给定的行数为零。

比较时使用的一种更典型的if形式是使用复合命令[[或shell内建指令[或test命令。使用它们来检测文件属性或对值进行比较。

要测试文件系统上是否存在文件:if [[ -e $FILENAME ]]then echo $FILENAME existsfi

表2-1列出了通过使用if比较可以对文件进行的其他测试。表2-1:文件测试操作符

检验变量$VAL是否小于变量$MIN:if [[ $VAL -lt $MIN ]]then echo "value is too small"fi

表2-2列出了可以使用if比较完成的其他数值测试。表2-2:数值测试操作符小心使用小于号(<)。以下面代码为例:if [[ $VAL < $OTHR ]]

在此上下文中,小于操作符使用词法(字母顺序)排序。这意味着12小于2,因为它们是按字母顺序排列的(就像a

如果你想对小于号进行数值比较,请使用双圆括号结构,它假定

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载