Linux安全实践-Linux Hacking 课件 第6章 shell 基础_第1页
Linux安全实践-Linux Hacking 课件 第6章 shell 基础_第2页
Linux安全实践-Linux Hacking 课件 第6章 shell 基础_第3页
Linux安全实践-Linux Hacking 课件 第6章 shell 基础_第4页
Linux安全实践-Linux Hacking 课件 第6章 shell 基础_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章shell基础6.1

shell简介6.2

shell变量6.3流程控制6.4

I/O重定向6.5用户输入与脚本控制6.6实用脚本举例

6.1shell简介

内核、shell和文件系统共同构成了基本的操作系统结构,使得用户可以运行各种程序、管理各类文件和使用操作系统。

shell顾名思义就是“外壳”,和Linux系统的内核(Kernel)相对应,比喻其工作在内核的外面一层,是用户跟内核交互和对话的界面。

作为Linux系统下的shell有多重含义,主要体现在以下3个方面:

(1)命令语言:用户直接在终端提供的shell界面中执行shell命令,前面各节所使用的Linux系统命令本质上都是shell命令。

(2)应用程序:用交互方式解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应的功能。

(3)程序设计语言:提供计算机语言所需要的常量、变量、数组、控制结构、函数等各种要素,完成shell命令的程序化、自动化运行。

作为系统内核和用户进行交互的界面,shell在用户程序与内核之间建立了两条通道,如图6-1所示。第一条通道是在程序中直接调用“系统调用接口”来获取内核提供的各种服务;第二条则是通过shell或者是库函数间接使用“系统调用接口”。图6-1操作系统内核、Shell和文件系统结构关系

Linux系统支持的所有shell都可以在配置文件“/etc/shells”中查看,现阶段大多数Linux发行版所使用的shell均为Bashshell,几乎可以涵盖shell所有的功能。当前用户登录所使用的shell在“/etc/shells”中有所记录,系统支持的shell文件一般放在系统的“/bin”目录下。也可以通过环境变量$SHELL来查看当前设备的默认shell,如图6-2所示。图6-2系统的Shell类型

进入Linux后按下Ctrl+Alt+T组合键就能打开终端,这时就可以输入各种shell命令。在终端输入vimHelloWorld.sh创建并开始编写第一个shell脚本。编辑HelloWorld.sh的内容如下:

执行shell脚本的方式有以下4种:

(1)将脚本文件作为bash解释器的参数:bashHelloWorld.sh(注意,此时脚本中#!指定的解释器不起作用)。

(2)为脚本添加可执行权限作为二进制文件执行:chmod+xHelloWorld.sh;./

HelloWorld.sh(后台会启动一个新的shell去执行脚本)。

(3)使用bash内置命令source执行:sourceHelloWorld.sh或.HelloWorld.sh(不会启动新的shell,直接由当前的shell去解释执行脚本)。

(4)后台运行:./HelloWorld.sh&。对于后台运行的进程可以通过命令jobs或ps-ef查看执行状态。

6.2shell变量

6.2.1用户变量

shell和其他编程语言一样支持变量的定义来临时保存数据,并在程序中使用变量。用户变量又称为局部变量,主要用于shell脚本内部。变量命名的规则要求如下:(1)变量名字只能使用英文字母、数字和下划线。(2)变量首个字符不能以数字开头,变量名字中间不能有空格。(3)变量不能使用标点符号。(4)变量不能使用bash关键字(可用help命令查看保留关键字)等。

变量的定义方式有以下4种:

(1)通过等号直接赋值(name=value)。

(2)通过命令执行结果赋值给变量(result='find/etc-namepasswd',注意此处命令两边的符号是反引号)。

(3)通过交互式定义变量(read选项变量名)。

(4)使用declare定义有类型的变量(declare选项变量名=变量值),其中“-a”选项表示声明一个数组,“-A”选项声明一个关联数组,“-i”声明一个整型,“-r”声明一个只读变量。

在shell脚本中使用变量时,需要使用“$”符号告诉解释器这是变量类型(而不是关键字或函数等),如echo$name或echo${name}。变量使用举例如图6-3所示。图6-3Shell变量使用

6.2.2系统变量

shell编程除了用户自定义变量外,还存在一些特殊变量,这些变量在脚本中可以作为全局变量来使用。shell常见的特殊变量之一就是系统变量,用于对参数判断和命令返回值判断时使用,如图6-4所示。系统变量主要有:

(1)$0:当前脚本的名称。

(2)$n:传递给当前脚本的第n个参数,n=1,2,…,9。

(3)$*:当前脚本的所有参数(所有参数作为一个整体,不包括程序本身)。

(4)$@:当前脚本的所有参数(每个参数可单独使用,不包括程序本身)。

(5)$#:当前脚本的参数个数(不包括程序本身)。

(6)$?:执行结束后的状态,返回0表示执行成功;可以把“?”看成是询问。

(7)$$:程序本身的PID号。图6-4Shell系统变量使用

6.2.3环境变量

shell的第二种特殊变量就是环境变量,主要是程序运行时上下文的环境参数,常见的有:

(1)PATH:命令搜索路径,以冒号分割。

(2)HOME:用户家目录。

(3)SHELL:当前Shell类型。

(4)USER:当前用户名。

(5)ID:当前用户ID信息。

(6)PWD:当前脚本所在路径。

(7)TERM:当前终端类型。

(8)HOSTNAME:当前主机名。

(9)PS1:主机命令提示符。

(10)HISTSIZE:历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间。

(11)RANDOM:随机生成一个0至32767的整数。

使用示例如图6-5所示,图中环境变量之间的“--”可以是其他任意字符。图6-5Shell环境变量使用

通过set、env命令可以对特殊变量进行查看和设置,区别在于env只能查询出环境变量,而set命令可以查询出所有变量。删除变量可以用unset命令。还可以使用export命令将某个变量声明为环境变量,这样所有shell都能访问到该变量,最典型的就是PATH环境变量的使用,如图6-6所示。图6-6ShellPATH环境变量输出

6.2.4字符串

shell中同样支持字符串类型的变量,字符串可以用单引号、双引号甚至不用引号。但单引号对字符串进行处理时其中的任何字符都会原样输出,也就是不会对其中的变量名进行解析;单引号字符串中不能包含其他单引号,即使使用转义符也不行。而双引号字符串中可以对变量进行解析,且能够使用转义符。单、双引号的差异如图6-7所示。图6-7单双引号差异

对于字符串的常见操作有拼接字符串(如"hello,$name"或'hello'$name)、获取长度(${#name})、提取子串(${name:1:2})等,如图6-8所示。图6-8字符串常见操作

6.2.5数组

shell支持一维数组,并且不限定数组的大小;数组元素类似其他编程语言,其下标也是从0开始。数组的定义一般形式为“数组名=(值1值2...值n)”;访问数组元素的一般形式为“${数组名[下标]}”;获取数组中的所有元素的形式为“${数组名[@]}”;获取数组元素的个数的形式为“${#数组名[@]}”。数组的使用如图6-9所示。图6-9数组使用举例

编写一个脚本用于设置系统的环境变量(命令历史记录相关)为只读属性,

代码如下:

readonly_env_var.sh脚本中将关键环境变量放置于env_var数组,for循环遍历数组,并对每个元素执行readonly命令设置为只读,以防止普通用户截断命令历史,并能够更有效地审计普通用户的系统使用行为。任何用户如果修改上述环境变量将给出以下提示:

6.3流程控制

6.3.1表达式1.算术表达式在前面字符串的定义中可以不使用单引号或双引号,故而数值运算中无法区分是否为字符串,因此在shell编程中不能直接进行数学运算,必须使用数学计算命令。shell中常用的数学计算命令如下:

•let:用于整数运算,和(())类似。

•$[]:用于整数运算,不如(())灵活。

•$(()):用于整数运算,效率很高,推荐使用。

•expr:用于整数运算,也可以处理字符串,比较繁琐,不推荐使用。

图6-10所示为两个变量之间的加、乘、模运算的使用举例:图6-10算术运算举例

2.条件表达式

条件的判断涉及关系运算、逻辑运算、字符串和文件测试运算四类,每一类涉及的条件判断又有test、[]、[[]]和(())四种使用方式,四类运算符和四种使用方式的典型匹配情况如图6-11所示。图6-11条件运算符和使用方式

1)test表达式

test表达式用于测试if语句中的条件是否成立,若成立执行if的then分支,否则执行其他分支。进行数值比较时,常见的“<”“>”需要加转义字符,或者直接使用“gt”“t”“eq”等操作;进行字符串比较时,以ASCII码数值大小作为比较依据,支持“=”“==”“!=”等操作;进行逻辑运算时,不支持“&&”“||”操作,使用“a”“o”替换,示例如图6-12所示。图6-12test举例

2)方括号形式:[expression]

方括号形式的用法和test命令相同,中括号和运算符两边都必须添加空格,如图6-13所示。图6-13方括号举例

3)成对方括号形式:[[expression]]

成对方括号形式是扩展的test命令,中括号和运算符两边都必须有空格;字符串验证时推荐使用,可以进行模式匹配(将右边字符串当作模式,甚至支持正则);进行逻辑运算时,使用“!”“&&”“||”进行非、与、或运算,如图6-14所示。图6-14成对方括号举例

4)成对圆括号形式:((expression))

成对圆括号形式的小括号和表达式两边不需要空格;数字验证时推荐使用,可以直接使用“=”“<”“>”“>=”“<=”进行运算,且双括号中变量可以不用“$”前缀;进行逻辑运算时,使用“!”“&&”“||”进行非、与、或运算,如图6-15所示。图6-15成对圆括号举例

5)文件检查

文件检查和测试用于判断文件或者目录的一些属性,例如读写执行权限、文件类型、文件的特殊标志位、文件是否存在等,该项检查可以使用test、[]和[[]],举例如图6-16所示。图6-16文件检查举例

6.3.2顺序结构

顺序结构是自上而下按顺序执行脚本中代码的结构。以下的Shell脚本(List_interface_info.sh)列举本机的网络信息,代码如下:

List_interface_info.sh中使用ifconfig命令(第2行)显示ens33网卡的基本信息,从中使用grep搜索IPv4地址,最后使用awk命令进行文本行切割取得IP地址和子网掩码(第4行);使用route命令(第3行)取得网关IP地址;使用iplink命令(第5行)取得MAC地址;使用who、cut命令(第6行)取得正在登录的系统用户名;使用ethtool工具(第7行)结合grep、sed取得网卡速度;最后echo按行打印结果。

6.3.3分支结构

顺序结构可谓是一条道走到黑,一路向前不回头。但在实际应用当中经常需要根据某些状态进行判断之后再做出对应的处理,这就需要使用分支(选择)结构。分支结构的执行流程如图6-17所示。图6-17Shell的分支执行流程图

多分支情况则是用elif将else部分扩充,每个elif都有一个条件判断表达式。如果第一个if判定为假,则检查第二个elif子句,如果还不满足则继续下一个,都不满足则执行else子句后面的命令。多分支的典型代码结构如下所示(注意,下述代码当中的方括号可以是其他的形式):

在Linux系统的日常安全运维中经常需要对系统用户进行定期检查,看是否存在潜在的恶意用户。攻击者在进入系统后通常会进行提权操作,任何UID为0的账户都具有系统上的超级用户权限,因此安全运维人员需要检查系统中是否存在除root之外UID为0的用户。例如:

6.3.4循环结构

1.for循环

for循环有两种形式,一种是for...in格式,如下所示:

例如,对于前面所学的数组,可以结合for进行数组元素的遍历,

代码如下:

上述代码将分行逐个打印arr数组中的元素。

for循环的另一种形式和C语言类似:

表达式1(expression1)是初始值,然后判断表达式2(expression2)如果为真则执行后续的循环体命令(commands),执行完毕评估表达式3(expression3),表达式3通常是更新某些变量,然后继续判断表达式2,如此往复执行。以下示例代码完成整数1~10的显示,注意for语句的成对圆括号形式:

2.while循环while

循环的一般结构形式如下:

例如一般网站会设置IP访问次数限制,如果访问次数过多,会给网站造成负荷过大。安全管理员可以通过网站访问日志查看IP地址的访问情况。现在编写一个shell脚本统计Apache日志中各IP的访问次数,代码如下:

6.4I/O重定向

6.4.1文件描述符文件描述符是表述“指向文件的引用”的“抽象化”概念,形式上是一个非负整数。每个进程在PCB(ProcessControlBlock)中都维护着一张文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符和对应的文件指针,用于对文件进行操作。

文件描述符、文件、进程三者的关系为:

•每个文件描述符与一个打开的文件相对应。

•不同的文件描述符可能指向同一个文件。

•相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开。

Linux进程默认会打开三个缺省的文件描述符,分别是stdin、stdout和stderr。这三个文件描述符也称为数据流(Stream),可以理解为程序与其环境之间的输入和输出通信通道,具体含义如下:

•stdin(标准输入):文件描述符为0,指示从键盘输入的任何文本。

•stdout(标准输出):文件描述符为1,指示命令正常执行的结果。

•stderr(标准错误输出):文件描述符为2,指示命令执行错误时的系统提示。

数据流及其文件描述符的形象表达如图6-18所示。图6-18标准输入输出和错误流

6.4.2常见重定向

重定向运算符是控制运算符的子集,它们允许用户控制命令的输入流的来源或输出流的去向,本质上就是修改进程PCB中文件描述符表中三个文件对应的文件指针。常见的重定向符号如图6-19所示。图6-19重定向符号

使用符号“&”可以复制一个文件描述符,表示复制文件描述符到另外一个文件描述符中作为其副本。[n]>&m或[n]<&m都表示文件描述符n重用m代表的文件或描述符,即m对应哪个文件,现在n也对应哪个文件。[n]>&m,n不指定则默认为1(标准输出),就是将标准输出指向m所代表的文件或描述符中;[n]<&m,n不指定则默认为0(标准输入),就是将标准输入指向m所代表的文件或描述符中。

6.4.3重定向实现端口扫描

下面利用重定向和“/dev/tcp”文件创建一个端口扫描程序(scan.sh),代码如下:

在文件描述符前加&只进行了临时重定向,想要永久重定向脚本中的所有命令,需要使用exec命令在脚本文件开始部分指定脚本执行期间需要重定向的某个特定文件描述符。如exec1>testout(将STDOUT输出到testout文件)、exec2>testerror(将STDERR输出到testerror文件)、exec0<testfile(从STDIN输入)、exec3>&-(关闭文件描述符)。

6.5用户输入与脚本控制

6.5.1位置参数位置参数变量是标准的数字:$0是程序名、$1是第一个参数、$2是第二个参数,以此类推。参数中有空格等特殊字符时需要使用引号或转义处理。

6.5.2特殊参数变量

除了位置参数,bash还提供了一些特殊的参数变量,如$#表示参数总个数、$*表示所有参数组成的整体字符串、$@表示所有参数作为一个字符串的多个独立单词、$$表示分配给进程的PID。

备份是系统中需要考虑的最重要的事项,为了简化操作,编写一个shell脚本对MySQL数据库的数据进行备份。首先要使用shell脚本测试MySQL用户名是否能连接成功,除了将用户名口令直接写入文件,还可以通过命令行参数进行传递。

“$?”表示上一条命令的执行结果,第1行flag表示前文MySQL建立连接的结果;第8行${backup_db_err[@]}取出数组的所有值进行循环遍历,循环体中所有mysqldump命令对数据库进行备份,并gzip压缩到mysql.sql.gz文件。

MySQL数据库的恢复流程:使用gunzip命令对mysql.sql.gz文件进行解压,在MySQL模式下用use进入某个数据库,使用source命令进行还原。

6.5.3查找选项

脚本中除了使用位置参数和特殊参数,还能对参数进行控制。使用shift命令能将位置参数进行左移操作,用于shell在不知道位置变量个数的情况下还要逐个地把参数一一处理的情况。

当用户输入多个参数时,while循环每次取第1个参数,循环体匹配case选项之后,执行shift将$2向左移为$1,实现了参数遍历。执行结果如下:

6.6实用脚本举例

6.6.1记录所有用户的登录和操作日志

Linux系统使用history记录历史命令,但是不能记录这个命令是哪个用户操作的。现在要使用脚本来实现记录所有用户的登录时间操作日志。该功能需要对所有用户有效,因此需要将shell脚本代码写入/etc/profile,打开/etc/profile文件,在末尾添加:

代码中whoami获取当前用户名,第2行awk取出当前用户的IP且删除两侧括号;三个if语句用于构造日志文件名称;export命令指定当前用户运行环境中保存历史命令文件为自定义的文件;最后为了预防日志注入,可以将日志目录设置为600权限。将以上代码写入配置文件后,执行source/etc/profile,查看/var/log/history目录:

6.6.2监控磁盘利用率

通常,服务器的磁盘

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论