1、项目八 学习shell script2项目导入理解shell script。掌握判断式的用法。掌握条件判断式的用法。掌握循环的用法。职业能力目标和要求如果想要管理好属于你的主机,那么一定要好好学习shell script。shell script有点像是早期的批处理,即将一些命令汇总起来一次运行。但是shell script拥有更强大的功能,那就是它可以进行类似程序(program)的撰写,并且不需要经过编译(compile)就能够运行,非常方便。同时,我们还可以通过shell script来简化我们日常的工作管理。3项目八 学习shell script 任务1 了解shell script8
2、.1.1 子任务1 了解shell script什么是shell script(程序化脚本)呢?就字面上的意义,我们将其分为两部分。在“shell”部分,我们在项目七中已经提过了,那是在命令行界面下让我们与系统沟通的一个工具接口。那么“script”是什么?字面上的意义,script是“脚本、剧本”的意思。整句话是说,shell script是针对shell所写的“脚本”。1在shell script撰写中的注意事项命令的执行是从上而下、从左而右进行的。命令、选项与参数间的多个空格都会被忽略掉。空白行也将被忽略掉,并且按“Tab”键所生成的空白同样被视为空格键。如果读取到一个Enter符号(C
3、R),就尝试开始运行该行(或该串)命令。如果一行的内容太多,则可以使用“Enter”来延伸至下一行。“#”可作为注解。任何加在#后面的数据将全部被视为注解文字而被忽略。8.1.2 子任务2 编写与执行一个shell script4 2运行shell script程序现在我们假设程序文件名是/home/dmtsai/shell.sh,那如何运行这个文件呢?很简单,可以有下面几个方法。(1)直接命令下达:shell.sh文件必须要具备可读与可运行(rx)的权限。绝对路径:使用/home/dmtsai/shell.sh来下达命令。相对路径:假设工作目录在/home/dmtsai/,则使用./shel
4、l.sh来运行。变量“PATH”功能:将shell.sh放在PATH指定的目录内,例如:/bin/。56(2)以bash程序来运行:通过“bash shell.sh”或“sh shell.sh”来运行。由于linux默认使用者家目录下的/bin目录会被设置到$PATH内,所以你也可以将shell.sh创建在/home/dmtsai/bin/下面(/bin目录需要自行设置)。此时,若shell.sh在/bin内且具有rx的权限,那就直接输入shell.sh即可运行该脚本程序。那为何“sh shell.sh”也可以运行呢?这是因为/bin/sh其实就是/bin/bash(连结档),使用sh she
5、ll.sh即告诉系统,我想要直接以bash的功能来运行shell.sh这个文件内的相关命令,所以此时你的shell.sh只要有r的权限即可被运行。而我们也可以利用sh的参数,如-n及-x来检查与追踪shell.sh的语法是否正确。3编写第一个shell script程序7rootRHEL7-2#cd;mkdir scripts;cd scriptsrootRHEL7-2 scripts#vim sh01.sh#!/bin/bash#Program:#This program shows Hello World!in your screen.#History:#2018/08/23BobbyFi
6、rst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATHecho-e Hello World!a nexit 0在本项目中,请将所有撰写的script放置到家目录的/scripts这个目录内,以利于管理。8.1.3 子任务3 养成撰写shell script的良好习惯 养成良好习惯是很重要的,但大家在刚开始撰写程序的时候,最容易忽略这部分,认为程序写出来就好了,其他的不重要。其实,如果程序的说明能够更清楚,那么对自己是有很大帮助的。建议一定要养成良好的script撰写
7、习惯,在每个script的文件头处包含如下内容。script的功能。script的版本信息。script的作者与联络方式。script的版权声明方式。script的History(历史记录)。8 script内较特殊的命令,使用“绝对路径”的方式来执行。script运行时需要的环境变量预先声明与设置。除了记录这些信息之外,在较为特殊的程序部分,个人建议务必要加上注解说明。此外,程序的撰写建议使用嵌套方式,最好能以“Tab”键的空格缩排。这样你的程序会显得非常漂亮、有条理,可以很轻松地阅读与调试程序。另外,撰写script的工具最好使用vim而不是vi,因为vim有额外的语法检验机制,能够在第一
8、阶段撰写时就发现语法方面的问题。9 任务2 练习简单的shell script 8.2.1 子任务1 完成简单范例1对话式脚本:变量内容由使用者决定很多时候我们需要使用者输入一些内容,好让程序可以顺利运行。要求:使用read命令撰写一个script。让用户输入first name与last name后,在屏幕上显示“Your full name is:”的内容:102Linux Shell同Linux本身一样,Shell也有多种不同的版本。目前,主要有下列版本的Shell。Bourne Shell:是贝尔实验室开发的版本。BASH:是GNU的Bourne Again Shell,是GNU操作系
9、统上默认的Shell。Korn Shell:是对Bourne Shell的发展,在大部分情况下与Bourne Shell兼容。C shell:是SUN公司Shell的BSD版本。Shell不仅是一种交互式命令解释程序,而且还是一种程序设计语言。11 Shell脚本程序是解释型的,也就是说Shell脚本程序不需要进行编译,就能直接逐条解释,逐条执行脚本程序的源语句。Shell脚本程序的处理对象只能是文件、字符串或者命令语句,而不像其他的高级语言有丰富的数据类型和数据结构。作为命令行操作界面的替代选择,Linux还提供了像Microsoft Windows那样的可视化界面X-Window的图形用户
10、界面(GUI)。现在比较流行的窗口管理器是KDE和Gnome(其中Gnome是Red Hat Linux默认使用的界面),两种桌面都能够免费获得。1213rootRHEL7-2 scripts#vim sh02.sh#!/bin/bash#Program:#User inputs his first name and last name.Program shows his full name.#History:#2012/08/23BobbyFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbi
11、n:/binexport PATH read-p Please input your first name:firstname#提示使用者输入read-p Please input your last name:lastname#提示使用者输入echo-e nYour full name is:$firstname$lastname#结果由屏幕输出rootRHEL7-2 scripts#sh sh02.sh142随日期变化:利用date进行文件的创建假设服务器内有数据库,数据库每天的数据都不一样,当备份数据库时,希望将每天的数据都备份成不同的文件名,这样才能让旧的数据也被保存下来而不被覆盖。怎
12、么办?考虑到每天的“日期”并不相同,所以可以将文件名取成类似:backup.2018-09-14.data,不就可以每天一个不同文件名了吗?确实如此。那么2018-09-14是怎么来的呢?我们看下面的例子:假设我想要创建3个空的文件(通过touch),文件名开头由用户输入决定,假设用户输入“filename”,而今天的日期是2018/07/15,若想要以前天、昨天、今天的日期来创建这些文件,即filename_20180713,filename_20180714,filename_20180715,该如何编写程序?15rootRHEL7-2 scripts#vim sh03.sh#!/bin/
13、bash#Program:#Program creates three files,which named by users input and date command.#History:#2018/07/13BobbyFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATH#让使用者输入文件名称,并取得fileuser这个变量echo-e I will use touch command to create 3 files.#纯粹显示信息read-p Plea
14、se input your filename:fileuser#提示用户输入#为了避免用户随意按“Enter”键,利用变量功能分析文件名是否设置?filename=$fileuser:-filename#开始判断是否设置了文件名 16#开始利用date命令来取得所需要的文件名date1=$(date-date=2 days ago +%Y%m%d)#前两天的日期,注意+号前面有个空格date2=$(date-date=1 days ago +%Y%m%d)#前一天的日期,注意+号前面有个空格date3=$(date+%Y%m%d)#今天的日期file1=$filename$date1#这三行设
15、置文件名file2=$filename$date2file3=$filename$date3#创建文件touch$file1 touch$file2touch$file3rootRHEL7-2 scripts#sh sh04.shrootRHEL7-2 scripts#ll 173数值运算:简单的加减乘除可以使用declare来定义变量的类型,利用“$(计算式)”来进行数值运算。不过可惜的是,bash shell默认仅支持到整数。下面的例子要求用户输入两个变量,然后将两个变量的内容相乘,最后输出相乘的结果。rootRHEL7-2 scripts#vim sh04.sh#!/bin/bash#P
16、rogram:#User inputs 2 integer numbers;program will cross these two numbers.#History:#2018/08/23BobbyFirst releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATHecho-e You SHOULD input 2 numbers,I will cross them!n18read-p first number:firstnuread-p second number:sec
17、nutotal=$($firstnu*$secnu)echo-e nThe result of$firstnu$secnu is=$totalrootRHEL7-2 scripts#sh sh04.sh在数值的运算上,我们可以使用“declare-i total=$firstnu*$secnu”,也可以使用上面的方式来表示。建议使用下面的方式进行运算:var=$(运算内容)不但容易记忆,而且也比较方便。因为两个小括号内可以加上空白字符。至于数值运算上的处理,则有+、-、*、/、%等,其中%是取余数。rootRHEL7-2 scripts#echo$(13%3)18.2.2 子任务2 了解脚本的
18、运行方式的差异不同的脚本运行方式会造成不一样的结果,尤其对bash的环境影响很大。脚本的运行方式除了前面小节谈到的方式之外,还可以利用source或小数点(.)来运行。那么这些运行方式有何不同呢?1利用直接运行的方式来运行脚本当使用前一小节提到的直接命令(不论是绝对路径/相对路径还是$PATH内的路径),或者是利用bash(或sh)来执行脚本时,该脚本都会使用一个新的bash环境来运行脚本内的命令。也就是说,使用这种执行方式时,其实脚本是在子程序的bash内运行的,并且当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中。这是什么意思呢?我们以刚刚提到过的sh02.sh这个脚
19、本来说明。这个脚本可以让使用者自行配置两个变量,分别是firstname与lastname。想一想,如果你直接运行该命令时,该命令帮你配置的firstname会不会生效?看一下下面的运行结果:19rootRHEL7-2 scripts#echo$firstname$lastname=首先确认变量并不存在rootRHEL7-2 scripts#sh sh02.shPlease input your first name:Bobby =这个名字是读者自己输入的Please input your last name:YangYour full name is:Bobby Yang =看吧!在脚本运行
20、中,这两个变量会生效rootRHEL7-2 scripts#echo$firstname$lastname =事实上,这两个变量在父程序的bash中还是不存在20从上面的结果可以看出,sh02.sh配置好的变量竟然在bash环境下面会无效。怎么回事呢?我们用图8-1来说明。当你使用直接运行的方法来处理时,系统会开辟一个新的bash来运行sh02.sh里面的命令。因此你的firstname、lastname等变量其实是在图8-1中的子程序bash内运行的。当sh02.sh运行完毕后,子程序bash内的所有数据便被移除,因此上面的练习中,在父程序21 子 程 序 bash sleep 父 程 序
21、bash sh sh02.sh 在 此 执 行 2利用source运行脚本:在父程序中运行如果使用source来运行命令,那会出现什么情况呢?请看下面的运行结果:rootRHEL7-2 scripts#source sh02.shPlease input your first name:Bobby=这个名字是读者自己输入的Please input your last name:YangYour full name is:Bobby Yang =在script运行中,这两个变量会生效 rootRHEL7-2 scripts#echo$firstname$lastnameBobby Yang =有
22、数据产生22 任务3 用好判断式在项目7中,我们提到过$?这个变量所代表的意义。在项目7的讨论中,如果想要判断一个目录是否存在,当时我们使用的是ls这个命令搭配数据流重导向,最后配合$?来决定后续的命令进行与否。但是否有更简单的方式可以来进行“条件判断”呢?有,那就是“test”这个命令。8.3.1 子任务1 利用test命令的测试功能当需要检测系统上面某些文件或者是相关的属性时,利用test命令是最好不过的选择。举例来说,我要检查/dmtsai是否存在时,使用:rootRHEL7-2#test -e /dmtsai运行结果并不会显示任何信息,但最后我们可以通过$?或&及|来显示整个结果。例如
23、,我们将上面的例子改写成这样(也可以试试/etc目录是否存在):rootRHEL7-2#test -e /dmtsai&echo exist|echo Not existNot exist$0echo Total parameter number is=$#$#-lt 2&echo The number of parameter is less than 2.Stop here.&exit 0echo Your whole parameter is =$echo The 1st parameter =$1echo The 2nd parameter =$231执行结果如下(第一次使用一个参数p
24、ar1运行,第二次使用4个参数运行):rootrhel7-2 scripts#sh sh07.sh par1The script name is =sh07.shTotal parameter number is=1The number of parameter is less than 2.Stop here.rootrhel7-2 scripts#sh sh07.sh par1 par2 par3 par4The script name is =sh07.shTotal parameter number is=4Your whole parameter is =par1 par2 par3
25、 par4The 1st parameter =par1The 2nd parameter =par2328.3.4 子任务4 shift:造成参数变量号码偏移除此之外,脚本后面所接的变量是否能够进行偏移(shift)呢?什么是偏移呢?我们直接以下面的范例来说明。下面将sh07.sh的内容稍作变化,用来显示每次偏移后参数的变化情况。rootRHEL7-2 scripts#vim sh08.sh#!/bin/bash#Program:#Program shows the effect of shift function.#History:#2018/02/17 Bobby First relea
26、sePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATHecho Total parameter number is=$#echo Your whole parameter is =$shift#进行第一次“1个变量的偏移”echo Total parameter number is=$#echo Your whole parameter is =$shift 3#进行第二次“3个变量的偏移”echo Total parameter number is=$#echo Your whol
27、e parameter is =$33运行结果如下:rootRHEL7-2 scripts#sh sh08.sh one two three four five six 6 one two three four five sixTotal parameter number is=5 two three four five sixTotal parameter number is=2 five six34任务4 使用条件判断式8.4.1 子任务1 利用if.thenif.then是最常见的条件判断式。简单地说,就是当符合某个条件判断的时候,就进行某项工作。if.then的判断还有多层次的情况,我
28、们将分别介绍。1单层、简单条件判断式如果你只有一个判断式要进行,那么我们可以简单地这样做:if 条件判断式;then 当条件判断式成立时,可以进行的命令工作内容;fi =将if反过来写,就成为fi了,结束if之意至于条件判断式的判断方法,与前一小节的介绍相同。比较特别的是,如果有多个条件要判断,除了sh06.sh那个案例所写的,也就是“将多个条件写入一个中括号内的情况”之外,还可以有多个中括号来隔开。而括号与括号之间,则以&或|来隔开,其意义如下。35&代表AND。|代表or。所以,在使用中括号的判断式中,&及|就与命令执行的状态不同了。举例来说,sh06.sh里面的判断式可以这样修改:$yn
29、=Y-o$yn=y 上式可替换为$yn=Y|$yn=y 之所以这样改,有的人是由于习惯问题,还有的人则是因为喜欢一个中括号仅有一个判断式的原因。下面我们将sh06.sh这个脚本修改为if.then的样式:rootRHEL7-2 scripts#cp sh06.sh sh06-2.sh =这样改得比较快rootRHEL7-2 scripts#vim sh06-2.sh#!/bin/bash#Program:#This program shows the users choice#History:#2018/08/25 Bobby First releasePATH=/bin:/sbin:/usr
30、/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATHread-p Please input(Y/N):ynif$yn=Y|$yn=y;then echo OK,continue exit 0fiif$yn=N|$yn=n;then echo Oh,interrupt!exit 0fiecho I dont know what your choice is&exit 0362多重、复杂条件判断式在同一个数据的判断中,如果该数据需要进行多种不同的判断,那么应该怎么做呢?举例来说,上面的sh06.sh脚本中,我们只要进行一次$yn
31、的判断(仅进行一次if),不想做多次if的判断。此时必须用到下面的语法:#一个条件判断,分成功进行与失败进行(else)if 条件判断式;then 当条件判断式成立时,可以进行的命令工作内容;else 当条件判断式不成立时,可以进行的命令工作内容;fi#多个条件判断(if.elif.elif.else)分多种不同情况运行if 条件判断式一;then 当条件判断式一成立时,可以进行的命令工作内容;elif 条件判断式二;then 当条件判断式二成立时,可以进行的命令工作内容;else 当条件判断式一与二均不成立时,可以进行的命令工作内容;fi37 在前面已经学会了grep这个好用的命令,现在再学
32、习netstat这个命令。这个命令可以查询到目前主机开启的网络服务端口(service ports)。我们可以利用“netstat-tuln”来取得目前主机启动的服务,取得的信息类似下面的样子:rootRHEL7-2#netstat -tulnActive Internet connections(only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:111 0.0.0.0:*LISTENtcp 0 0 127.0.0.1:631 0.0.0.0:*LISTENtcp 0 0 12
33、7.0.0.1:25 0.0.0.0:*LISTENtcp 0 0:22 :*LISTENudp 0 0 0.0.0.0:111 0.0.0.0:*udp 0 0 0.0.0.0:631 0.0.0.0:*#封包格式 本地IP:端口 远程IP:端口 是否监听38 上面的重点是“Local Address(本地主机的IP与端口对应)”那一列,代表的是本机所启动的网络服务。IP的部分说明的是该服务位于哪个接口上,若为127.0.0.1则是仅针对本机开放,若是0.0.0.0或:则代表对整个Internet开放。每个端口(port)都有其特定的网络服务,几个常见的port与相关网络服务的关系如下。80
34、:WWW。22:ssh。21:ftp。25:mail。111:RPC(远程程序呼叫)。631:CUPS(列印服务功能)。39 假设需要检测的是比较常见的port 21,22,25及80,那么如何通过netstat去检测我的主机是否开启了这4个主要的网络服务端口呢?由于每个服务的关键字都是接在冒号“:”后面,所以可以选取类似“:80”来检测。请看下面的程序:rootRHEL7-2 scripts#vim sh10.sh#!/bin/bash#Program:#Using netstat and grep to detect WWW,SSH,FTP and Mail services.#Histo
35、ry:#2018/08/28 Bobby First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATH40#先做一些告诉的动作echo Now,I will detect your Linux servers services!echo-e The www,ftp,ssh,and mail will be detect!n#开始进行一些测试的工作,并且也输出一些信息testing=$(netstat-tuln|grep:80)#检测port 80存在否if$testi
36、ng!=;then echo WWW is running in your system.fitesting=$(netstat-tuln|grep:22)#检测port 22存在否if$testing!=;then echo SSH is running in your system.fitesting=$(netstat-tuln|grep:21)#检测port 21存在否if$testing!=;then echo FTP is running in your system.fitesting=$(netstat-tuln|grep:25)#检测port 25存在否if$testing!
37、=;then echo Mail is running in your system.Fi运行结果:rootrhel7-2 scripts#sh sh10.sh41条件判断式还可以做得更复杂。举例来说,有个军人想要计算自己还有多长时间会退伍,那能不能写个脚本程序,让用户输入他的退伍日期,从而帮他计算还有多少天会退伍呢?由于日期是要用相减的方式来处置,所以我们可以通过使用date显示日期与时间,将其转为由1970-01-01累积而来的秒数,通过秒数相减来取得剩余的秒数后,再换算为天数即可。整个脚本的制作流程如下。先让用户输入他的退伍日期。再由现在的日期比对退伍日期。由两个日期的比较来显示“还需要
38、多少天”才能够退伍。其实很简单,利用“date-date=YYYYMMDD +%s”转成秒数后,接下来的动作就容易得多了。提示:“date-date=YYYYMMDD +%s”表示将“YYYYMMDD”表示的日期转换成自1970年1月1日以来的秒数。比如,计算现在的日期距离1970年1月1日的秒数并输出,可以这样操作(declare命令用于声明和显示已存在的shell变量,本例为date_now):rootrhel7-2 scripts#declare-i date_now=date +%s rootrhel7-2 scripts#echo$date_now1531647954428.4.2
39、子任务2 利用case.esac判断上个小节提到的“if.then.fi”对于变量的判断是以“比较”的方式来进行的,如果符合状态就进行某些行为,并且通过较多层次(就是elif.)的方式来进行含多个变量的程序撰写,比如 sh09.sh 那个小程序,就是用这样的方式来撰写的。但是,假如有多个既定的变量内容,例如sh09.sh当中,所需要的变量就是“hello”及空字符两个,那么这时只要针对这两个变量来设置情况就可以了。这时使用case.in.esac最为方便。case$变量名称in =关键字为case,变量前有$符 第一个变量内容)=每个变量内容建议用双引号括起来,关键字则为小括号)程序段 ;=每
40、个类别结尾使用两个连续的分号来处理 第二个变量内容)程序段 ;*)=最后一个变量内容都会用*来代表所有其他值 不包含第一个变量内容与第二个变量内容的其他程序运行段 exit 1 ;esac$0echo Total parameter number is=$#$#-lt 2&echo The number of parameter is less than 2.Stop here.&exit 0echo Your whole parameter is =$echo The 1st parameter =$1echo The 2nd parameter =$245执行结果如下(第一次使用一个参数p
41、ar1运行,第二次使用4个参数运行):rootrhel7-2 scripts#sh sh07.sh par1The script name is =sh07.shTotal parameter number is=1The number of parameter is less than 2.Stop here.rootrhel7-2 scripts#sh sh07.sh par1 par2 par3 par4The script name is =sh07.shTotal parameter number is=4Your whole parameter is =par1 par2 par3
42、 par4The 1st parameter =par1The 2nd parameter =par2468.3.4 子任务4 shift:造成参数变量号码偏移除此之外,脚本后面所接的变量是否能够进行偏移(shift)呢?什么是偏移呢?我们直接以下面的范例来说明。下面将sh07.sh的内容稍作变化,用来显示每次偏移后参数的变化情况。rootRHEL7-2 scripts#vim sh08.sh#!/bin/bash#Program:#Program shows the effect of shift function.#History:#2018/02/17 Bobby First relea
43、sePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATH47echo Total parameter number is=$#echo Your whole parameter is =$shift#进行第一次“1个变量的偏移”echo Total parameter number is=$#echo Your whole parameter is =$shift 3#进行第二次“3个变量的偏移”echo Total parameter number is=$#echo Your wh
44、ole parameter is =$48运行结果如下:rootRHEL7-2 scripts#sh sh08.sh one two three four five six 6 one two three four five sixTotal parameter number is=5 two three four five sixTotal parameter number is=2 five six49 任务4 使用条件判断式8.4.1 子任务1 利用if.thenif.then是最常见的条件判断式。简单地说,就是当符合某个条件判断的时候,就进行某项工作。if.then的判断还有多层次的情
45、况,我们将分别介绍。1单层、简单条件判断式如果你只有一个判断式要进行,那么我们可以简单地这样做:if 条件判断式;then 当条件判断式成立时,可以进行的命令工作内容;fi =将if反过来写,就成为fi了,结束if之意至于条件判断式的判断方法,与前一小节的介绍相同。比较特别的是,如果有多个条件要判断,除了sh06.sh那个案例所写的,也就是“将多个条件写入一个中括号内的情况”之外,还可以有多个中括号来隔开。而括号与括号之间,则以&或|来隔开,其意义如下。508 8.4 4&代表AND。|代表or。所以,在使用中括号的判断式中,&及|就与命令执行的状态不同了。举例来说,sh06.sh里面的判断式
46、可以这样修改:$yn=Y-o$yn=y 上式可替换为$yn=Y|$yn=y 之所以这样改,有的人是由于习惯问题,还有的人则是因为喜欢一个中括号仅有一个判断式的原因。下面我们将sh06.sh这个脚本修改为if.then的样式:51rootRHEL7-2 scripts#cp sh06.sh sh06-2.sh$0 somewordelse echo The only parameter is hello,ex$0 hellofi运行结果:rootrhel7-2 scripts#sh sh9.sh57然后你可以执行这个程序,在$1的位置输入hello,没有输入与随意输入,就可以看到不同的输出。下面
47、我们继续来完成较复杂的例子。我们在前面已经学会了grep这个好用的命令,现在再学习netstat这个命令。这个命令可以查询到目前主机开启的网络服务端口(service ports)。我们可以利用“netstat-tuln”来取得目前主机启动的服务,取得的信息类似下面的样子:rootRHEL7-2#netstat -tulnActive Internet connections(only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:111 0.0.0.0:*LISTENtcp 0 0
48、 127.0.0.1:631 0.0.0.0:*LISTENtcp 0 0 127.0.0.1:25 0.0.0.0:*LISTENtcp 0 0:22 :*LISTENudp 0 0 0.0.0.0:111 0.0.0.0:*udp 0 0 0.0.0.0:631 0.0.0.0:*#封包格式 本地IP:端口 远程IP:端口 是否监听58上面的重点是“Local Address(本地主机的IP与端口对应)”那一列,代表的是本机所启动的网络服务。IP的部分说明的是该服务位于哪个接口上,若为127.0.0.1则是仅针对本机开放,若是0.0.0.0或:则代表对整个Internet开放。每个端口(p
49、ort)都有其特定的网络服务,几个常见的port与相关网络服务的关系如 下。80:WWW。22:ssh。21:ftp。25:mail。111:RPC(远程程序呼叫)。631:CUPS(列印服务功能)。59假设需要检测的是比较常见的port 21,22,25及80,那么如何通过netstat去检测我的主机是否开启了这4个主要的网络服务端口呢?由于每个服务的关键字都是接在冒号“:”后面,所以可以选取类似“:80”来检测。请看下面的程序:rootRHEL7-2 scripts#vim sh10.sh#!/bin/bash#Program:#Using netstat and grep to dete
50、ct WWW,SSH,FTP and Mail services.#History:#2018/08/28 Bobby First releasePATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/binexport PATH60#先做一些告诉的动作echo Now,I will detect your Linux servers services!echo-e The www,ftp,ssh,and mail will be detect!n#开始进行一些测试的工作,并且也输出一些信息testing=$(net