openEuler实验-使用Shell脚本实现局域网MAC地址收集和FTP服务监控

linux的简单运用

目录

前言

1. 实验目的

2. 实验内容

3. 实验知识点

4. 实验时长

5. 实验环境

实验分析

部署FTP服务器

1)安装FTP服务

2)查看FTP服务

3)启动FTP服务

4)关闭FTP服务

收集MAC地址

1)修改主机名

2)探测单台主机MAC信息

3)筛选探测结果

4)创建并编写脚本文件

5)执行脚本文件

6)查看搜集结果

检测FTP服务

1)创建并编辑脚本文件

2) 安装nmap命令工具

3) 监控单台主机

4)监控局域网主机

5)运行脚本文件

6)查看监控结果

总结


前言

在本文中,我将介绍如何使用Shell脚本在openEuler系统上实现一个简单的网络管理工具,它可以收集局域网内所有设备的MAC地址,并监控FTP服务的运行状态。这个工具可以帮助网络管理员了解网络拓扑结构,发现异常设备,以及检测FTP服务是否正常工作。

为什么要使用Shell脚本呢?Shell脚本是一种轻量级的编程语言,它可以直接在终端中执行,不需要编译或安装其他软件。Shell脚本可以方便地调用系统命令和工具,实现各种功能。Shell脚本也可以跨平台运行,只要有一个兼容的Shell解释器就可以了。openEuler系统默认提供了bash和zsh两种常用的Shell解释器,我们可以根据自己的喜好选择其中一种来编写脚本。

1. 实验目的

• 掌握FTP服务器的安装

• 掌握FTP服务器的配置与管理

• 掌握shell脚本基本语句的编写

• 掌握if语句的应用

• 掌握for语句的应用

• 掌握重定向输出的应用

• 掌握脚本语句的执行方式

2. 实验内容

使用Shell脚本对局域网中的所有主机进行MAC地址的收集,便于日常的维护管理。同时对局域网中部署FTP服务的主机进行监控,能够快速得知哪台具有FTP的主机在提供服务。下图该局域网的拓扑图。

图1局域网拓扑

实现MAC地址收集和FTP服务监控具体操作内容如下:

1)部署FTP服务器

使用dnf命令安装FTP服务,配置基本的ftp参数,对FTP服务进行启动、重启、关闭操作。

2)收集MAC地址

创建Shell脚本文件,编写如下过程:首先创建MAC地址的存储文件,然后使用arping命令,根据IP地址探测局域网中的主机获取对应的信息记录,应用grep命令、sed命令、awk命令对信息记录进行筛选,最后将筛选后的信息通过重定向命令输出到指定的文件中。

3)检测FTP服务

创建Shell脚本文件,编写如下过程:首先创建端口存储文件,然后使用nmap命令根据IP地址检测21号端口的状态,最后根据状态信息通过重定向名输出到指定的文件中。

3. 实验知识点

• 使用dnf命令安装FTP服务

• 使用systemctl命令管理FTP服务

• 使用touch命令创建文件

• 使用chmod命令修改文件权限

• 使用if语句进行条件判断

• 使用for语句进行循环遍历

• 使用重定向命令将数据输出到文件

• 应用sh命令执行脚本文件

4. 实验时长

共2学时:

• 部署FTP服务器和收集MAC地址(1学时)

• 检测FTP服务(1学时)

5. 实验环境

• 两台或多台互联的Linux主机(双核cpu、4G内存、40G硬盘、openEuler 20.3LTS操作系统)

实验分析

1)部署FTP服务器

• 使用dnf命令安装FTP

• 使用vim命令对FTP配置文件进行设置

• 使用systemctl start命令启动FTP服务

• 使用systemctl stop命令关闭FTP服务

• 使用systemctl status命令查看FTP服务运行状态

2)收集MAC地址

• 使用vim、hostname、su命令修改监控机主机名

• 使用arping命令探测主机MAC

• 使用grep、sed、awk命令筛选探测结果

• 使用vim命令创建并编写脚本文件

• 使用touch命令创建收集MAC文件

• 使用重定向命令输出筛选信息到收集MAC的文件

• 使用cat命令查看收集MAC文件的内容

3)检测FTP服务

• 使用vim命令创建并编写脚本文件

• 使用touch命令创建存储检测结果文件

• 使用dnf命令安装nmap软件包

• 使用nmap命令对IP的端口扫描

• 编写对局域网全部主机检测脚本

• 执行检测脚本

• 使用cat命令查看检测结果文件

部署FTP服务器

1)安装FTP服务

FTP服务器需要部署在非监控的主机上,使用dnf命令进行FTP的安装。在Linux中提供FTP服务的是vsftpd软件,命令实现如下:

【代码1-1】安装FTP服务

dnf install vsftpd    #dnf是新一代的软件包管理命令 其用法等同于yum命令

回车后如下图:

图2安装FTP服务

2)查看FTP服务

使用systemctl status命令查看FTP服务是否启动,具体的命令如下:

【代码1-2】查询FTP服务状态

systemctl status vsftpd #systemctl status为查询某个服务的状态 此处查询vsftpd服务状态

上述代码执行效果如下图:

图3查看FTP服务状态

由上述结果“Active: inactive (dead)”显示,当前的FTP服务处于停止状态。

3)启动FTP服务

使用systemctl start命令启动FTP服务,并应用systemctl status命令查看当前状态,命令实现如下:

【代码1-3】启动FTP服务并查看状态

systemctl start vsftpd  #systemctl start命令为启动指定服务
systemctl status vsftpd

上述代码执行效果如下图:

图4 启动FTP服务并查看状态

命令执行完毕,从上述结果“Active: active (running)”得知,ftp服务启动成功。

4)关闭FTP服务

使用systemctl stop命令关闭FTP服务,并使用systemctl status命令查看FTP服务状态,命令实现如下:

【代码1-4】关闭FTP服务,并查看状态

systemctl stop  vsftpd #systemctl stop为停止指定服务
systemctl status vsftpd

上述代码执行效果如下图:

图5 关闭FTP服务,并查看状态

命令执行完毕,从上述结果“Active: inactive (dead)”得知,FTP服务关闭成功,关闭后再次执行启动FTP服务命令保持服务在打开状态。

收集MAC地址

使用脚本收集MAC地址,首先在脚本文件中创建MAC地址的存储文件,然后使用arping命令在局域网中根据IP地址进行探测,接着应用筛选工具对探测的结果进行处理,最后将处理后的结果使用重定向命令输出到MAC地址的存储文件中。

1)修改主机名

为了在实验过程中区别于被测试机器,对监控主机的主机名进行修改,为了能够永久性修改主机名和当前显示为修改后的主机名,要对主机名存放文件“/etc/hostname”进行修改,同时使用hostname命令修改当前显示的主机名。

现使用vim命令修改主机名文件内容为“monitor”,命令实现如下:

【代码2-1】修改/etc/hostname文件

vim /etc/hostname    #通过vim命令可查询当前主机的hostname文件

进入到编辑页面后,按i进入编辑模式,将主机名修改为“monitor”,上述代码执行效果如下图所示:

图6修改/etc/hostname文件

输入完毕后,按下“ESC”键退出INSERT模式。输入“:wq”后回车退出编辑并保存文件。

使用hostname命令修改当前的主机名为“monitor”,并使用su 命令使新主机名生效,命令实现如下:

【代码2-2】修改当前主机名,并使其生效

hostname monitor       #hostname命令可以查看当前的主机名
su -					#su切换用户 切换用户后可以使新主机名生效

上述代码执行效果如下图所示:

图7修改当前主机名,并使其生效

命令执行完毕后,通过返回信息发现系统已经使用新的主机名。

2)探测单台主机MAC信息

为保证后面批量探测的可靠性,先对单台主机进行探测实验。使用arping命令结合参数-c、--w、-I,三个参数的介绍如下:

• -c:发送包的数量;

• -w:最长等待时间,单位为秒;

• -I:指定arping测试的网卡设备。

使用ifconfig命令查看本机IP,IP地址中的第三位代表网段,当第三位为1时,可以对192.168.1.1主机进行测试,命令语句为arping -c 2 -w 1 -I eth0 192.168.1.1;如果第三位为2时,可以对192.168.2.1主机进行测试,命令语句为arping -c 2 -w 1 -I eth0 192.168.2.1

针对局域网中的其他主机进行测试,例如IP为172.16.40.208,命令为:arping -c 2 -w 1 -I eth0 172.16.40.208 。(以下arping主机探测命令根据实际环境的IP,改用192.168.*.1即可,其中*代表当前主机IP的第三位数字。

【代码2-3】以172.16.40.208主机探测的为例

arping -c 2 -w 1 -I eth0 172.16.40.208 #arping可以探测mac地址 但是只能探测同一子网下的  -c:发送包的数量  -w:最长等待时间,单位为秒  -I:指定arping测试的网卡设备。

上述代码执行效果如下图所示:

图8探测172.16.40.208的主机

arping -c 2 -w 1 -I eth0 172.16.40.208命令语句中,eth0为网络接口的名称。该命令执行后,返回的探测结果显示发送2个探测包,收到2个应答包,表明命令成功执行。结果中IP地址后的中括号内的字符串即为MAC地址。

但如果探测没有成功,执行结果如何呢?现在对实验室另一台服务器进行测试,以IP为172.16.40.210 为例(需要替换为实际IP)命令实现如下:

【代码2-4】探测172.16.40.210的主机

arping -c 2 -w 1 -I eth0 172.16.40.210  #探测 172.16.40.210 可填写另一台主机或者其他同学实验主机的IP地址

上述代码执行效果如下图所示:

图9探测172.16.40.210的主机

如果显示,发送两个探测包,接受0个探测包,则表示探测失败,其原因为两台服务器可能不在同一网段,可以使用其他同学的相同网段服务器进行测试(使用ifconfig命令查看本机IP,IP地址中的第三位代表网段,网段地址第三位相同则表示网段)。

3)筛选探测结果

虽然通过arping命令能够将目标主机的MAC信息获取过来,但是这些信息并不是最终需要的结果,最终的结果应是单纯的IP地址和MAC地址的对应。所以,需要对探测的结果信息进行筛选处理。

现在逐步对探测结果进行处理,首先使用grep命令结合“^”正则表达式,该“^”表示匹配其后的字符串。过滤掉首尾无用信息,只选取具有“Unicast”字符串的行,操作的对象依旧是IP为172.16.40.208的主机,命令实现如下(实际环境中把相应的IP地址进行替换即可):

【代码2-5】过滤掉首尾无用信息

arping -c 2 -w 1 -I eth0 172.16.40.208 | grep "^Unicast"  #过滤处带有Unicast字样的项

上述代码执行效果如下图所示:

图10过滤掉首尾无用信息

命令执行完毕,相对于上次结果,已经过滤掉了首尾的信息,只保留了具有IP和MAC地址的信息行。

现在在现有的结果的基础上做进一步的筛选,使用sed命令结合正则表达式删除结果行中的“[”,命令实现如下(实际环境中把相应的IP地址进行替换即可):

【代码2-6】删除结果行中“[”

arping -c 2 -w 1 -I eth0 172.16.40.208 | grep "^Unicast" | sed -n "s/\[//p"   #在上一条命令的基础上使用正则表达式删除[符号

上述代码执行效果如下图所示:

图11 删除结果行中“[”

命令语句sed -n "s/\[//p"中,用-n参数只显示匹配的行,后面的表达式表示用空字符代替“[”,并输出。

再使用sed命令删除结果行中的“]”,命令实现如下(实际环境中把相应的IP地址进行替换即可):

【代码2-7】删除结果行中“]”

arping -c 2 -w 1 -I eth0 172.16.40.208 | grep "^Unicast" | sed -n "s/\[//p" | sed -n "s/\]//p"  #在上一条命令的基础上使用正则表达式删除]符号

上述代码执行效果如下图所示:

图12 删除结果行中“]”

命令语句sed -n "s/\]//p"中,用-n参数只显示匹配的行,后面的表达式表示用空字符代替“]”,并输出。

结果显示,所有的行都去掉了“[”和“]”。

最后使用awk命令,筛选出只有IP和MAC地址的结果行,命令实现如下(实际环境中把相应的IP地址进行替换即可):

【代码2-8】筛选出只有IP和MAC地址结果行

arping -c 2 -w 1 -I eth0 172.16.40.208 | grep "^Unicast" | sed -n "s/\[//p" | sed -n "s/\]//p" | awk '{print $4,$5}'  #在上一条命令的基础上以空格为分界线过滤出第四项和第五项

上述代码执行效果如下图所示:

图13 筛选出只有IP和MAC地址结果行

命令语句awk '{print $4,$5 }'中$4和$5分别表示结果行的第四列和第五列。结果显示,结果行中只有IP和MAC地址。

4)创建并编写脚本文件

现在使用vim命令创建名为getmac.sh的脚本文件,编写脚本内容为:在/usr目录下创建搜集MAC结果的存储文件mac。如果该目录下已有该名称的文件,则先将该文件进行备份为mac.bak,然后再创建mac文件,那么就要用到if条件判断语句判断该mac文件是否存在。命令实现如下:

【代码2-9】创建并编辑getmac.sh脚本文件

vim getmac.sh #使用vim命令编辑getmac.sh命令 如果没有此文件则会先创建文件 然后编辑此文件

打开getmac.sh脚本后,点击i进入编辑模式,ctrl+insert为复制内容,shift+insert为粘贴内容,esc键为退出编辑状态,在退出编辑状态中输入“:wq”并回车则保存并退出vim编辑器。

【代码2-10】getmac.sh脚本内容

#!/bin/bash                 #使用bin/bash解释器
if [ ! -f /usr/mac ]        #判断是否有/usr/mac 如果没有则创建 有则先备份再创建
    then
        touch /usr/mac
else
    mv /usr/mac /usr/mac.bak
    touch /usr/mac
fi

上述代码执行效果如下图所示:

图14 创建并编辑getmac.sh脚本文件

输入完毕后,按下“ESC”键退出INSERT模式。输入“:wq”后回车退出编辑并保存文件。

接下来需要对局域网中所有的主机进行探测,将探测的结果筛选后重定向输出到mac文件中。对每台探测的主机重复进行前面所做的一系列的筛选操作,就需要用到循环语句。

在本实验中,该局域网中共有254台主机(依据自己实验环境而定),那么对于确定的数目,可以使用for循环语句进行操作,扫描的范围越大所需要的时间越长,此处便于演示,将扫描范围改为1~5,仅演示效果。使用vim命令再次对getmac.sh脚本文件进行编辑,命令实现如下.

在实验环境中,将自己主机的IP地址的前三位替换172.16.40,例如当前主机IP为192.168.2.40,则用192.168.2替换掉172.16.40)

【代码2-11】使用vim打开getmac.sh文件

vim getmac.sh

打开后在文件中编辑以下内容并保存。

【代码2-12】向getmac.sh脚本文件添加全局域网探测脚本

#!/bin/bash
if [ ! -f /usr/mac ]
    then
        touch /usr/mac
else
    mv /usr/mac /usr/mac.bak
    touch /usr/mac
fi
for ((j=1;j<=5;j++))   #通过循环获取172.16.40.1~172.16.40.5地址中的Mac地址
do    arping -c 2 -w 1 -I eth0 172.16.40.$j |grep "^Unicast"|sed -n "s/\[//p" |sed -n  "s/\]//p" | awk '{print $4,$5}' | uniq  >> /usr/mac
done

上述代码执行效果如下图所示:

图15 向getmac.sh脚本文件添加全局域网探测脚本

输入完毕后,按下“ESC”键退出INSERT模式。输入“:wq”后回车退出编辑并保存文件。

上述代码中,语句“uniq >> /usr/mac”表示重复的结果只保留一条,然后重定向输出到mac文件中。

5)执行脚本文件

脚本文件的执行可以在脚本文件的所在的目录使用“./”后跟文件名的形式,也可以使用sh命令来执行,但首先需要对脚本文件添加可执行权限,命令实现如下:

【代码2-13】为getmac.sh脚本添加执行权限,并查看其权限

chmod a+x getmac.sh #为脚本添加执行权限
ll

上述代码执行效果如下图所示:

图16 为getmac.sh脚本添加执行权限,并查看其权限

现在使用sh命令执行脚本文件,命令实现如下:

【代码2-14】执行脚本文件getmac.sh

sh getmac.sh   #执行脚本

上述代码执行效果如下图所示:

图17 执行脚本文件getmac.sh

6)查看搜集结果

脚本文件执行完毕,使用cat命令查看mac文件中的结果,命令实现如下:

【代码2-15】查看文件mac

cat /usr/mac   #查看获取到的数据

上述代码执行效果如下图所示:

图18 查看文件mac

结果显示已经把整个局域网中在线的主机的MAC地址搜集到mac文件中了,包括IP地址为172.16.40.208的主机。

检测FTP服务

在局域网中,被监控FTP服务的有效主机,首先是处于在线状态的,对于寻找这些主机可以通过上面搜集MAC地址的实验中获取,因为arping探测的主机,有应答响应的才能获取结果,也同时表明,该应答响应的主机是处于在线的。然后,再通过namp命令对每个IP的端口进行探测筛选,将具有FTP服务的主机(开启了21号端口)的IP信息利用重定向命令输出到监控文件中。

首先创建并编写脚本文件,创建存储监控文件,同样也是要使用if语句判断创建的文件是否存在。

1)创建并编辑脚本文件

使用vim创建脚本文件getmonitor.sh,并编写脚本实现创建存储监控结果的文件monitor,该文件存储在/usr目录下,命令实现如下:

【代码3-1】使用vim创建并打开getmonitor.sh

vim getmonitor.sh

向打开的getmonitor.sh文件中添加以下内容,按“esc”并输入“:wq”,按回车保存并退出。

【代码3-2】编写创建监控结果存储文件monitor脚本

#!/bin/bash
if [ ! -f /usr/monitor ]
    then
        touch /usr/monitor
else
    mv /usr/monitor /usr/monitor.bak
    touch /usr/monitor
fi

上述代码执行效果如下图所示:

图19 创建脚本文件getmonitor.sh,并编写创建监控结果存储文件monitor脚本

输入完毕后,按下“ESC”键退出INSERT模式。输入“:wq”后回车退出编辑并保存文件。

2) 安装nmap命令工具

使用dnf命令安装nmap命令工具,操作命令如下:

【代码3-3】安装nmap软件包

dnf install nmap  #使用dnf命令安装nmap

上述代码执行效果如下图所示:

图20 安装nmap软件包

3) 监控单台主机

使用nmap命令对单台主机进行FTP检测,使用-sT参数与目标所有端口进行三次握手,尝试建立连接,如果某个端口连接成功,则表示端口开启。

使用ifconfig命令查看本机IP,IP地址中的第三位代表网段,当第三位为1时,可以对192.168.1.1主机进行测试,命令语句为nmap -sT 192.168.1.1;如果第三位为2时,可以对192.168.2.1主机进行测试,命令语句为nmap -sT 192.168.2.1

针对局域网中的其他主机进行测试,例如IP为172.16.40.208,命令为:nmap -sT 172.16.40.208 。(以下arping主机探测命令根据实际环境的IP,改用192.168.1.1或192.168.2.1即可。

【代码3-4】检测IP地址为172.16.40.208的主机

nmap -sT 172.16.40.208 #nmap命令可以检测指定IP的ftp服务

上述代码执行效果如下图所示:

图21 检测IP地址为172.16.40.208的主机

在结果中的PORT STATE SERVICE对应的项中,没有21号端口的信息,表示21号端口没有开启。在实验环境中,在跟监控机的IP同一网络的主机上,即IP地址的第三位一样的主机上安装FTP服务,以便实现测试(如另一台机器网段不同,则可以使用其他同学同一网段服务器进行测试)。

现在将IP地址为172.16.40.208的主机上的FTP服务开启并查看状态,命令实现如下。

【代码3-5】开启ftp服务并查看状态

systemctl start vsftpd 
systemctl status vsftpd

上述代码执行效果如下图所示:

图22开启FTP服务并查看状态

现在使用nmap命令再次进行检测,命令实现如下(实际环境中把相应的IP地址进行替换即可):

【代码3-6】再次检测IP地址为172.16.40.208的主机

nmap -sT 172.16.40.208 

上述代码执行效果如下图所示:

图23再次检测IP地址为172.16.40.208的主机

由结果“21/tcp open ftp”得知,21号端口开启,FTP服务运行中。

4)监控局域网主机

对局域网内所有主机进行监控,需要使用循环结构对每台主机进行检测。现在脚本文件中编写脚本实现全局域网检测,并使用重定向命令输出到monitor文件中,命令实现如下:

【代码3-7】使用vim打开getmonitor.sh

vim getmonitor.sh

向打开的getmonitor.sh文件中添加以下内容,按“esc”并输入“:wq”,按回车保存并退出。

【代码3-8】局域网全部主机检测脚本编写


#!/bin/bash
if [ ! -f /usr/monitor ]
    then
        touch /usr/monitor
else
    mv /usr/monitor /usr/monitor.bak
    touch /usr/monitor
fi
ipconnections=`awk '{print $1}' /usr/mac`  
for i in $ipconnections    #通过循环检测指定IP是否开启ftp服务
do

    echo "$i" >> /usr/monitor | nmap -sT $i | grep "21" >> /usr/monitor
done

上述代码执行效果如下图所示:

图23再次检测IP地址为172.16.40.208的主机

输入完毕后,按下“ESC”键退出INSERT模式。输入“:wq”后回车退出编辑并保存文件。

5)运行脚本文件

使用chmod命令修改脚本文件getmonitor.sh具有执行的权限,并查看操作结果,命令执行如下:

【代码3-9】增加getmonitor.sh文件的执行权限,并查看

chmod a+x getmonitor.sh 
ll 

上述代码执行效果如下图所示:

图24增加getmonitor.sh文件的执行权限,并查看

使用sh命令运行脚本文件getmonitor.sh,命令实现如下:

【代码3-10】执行脚本getmonitor.sh

sh getmonitor.sh 

上述代码执行效果如下图所示:

图25执行脚本getmonitor.sh

没有任何错误提示,表明脚本成功执行。

6)查看监控结果

使用cat命令查看monitor文件,以获知监控结果,命令实现如下:

【代码3-11】查看monitor文件

cat /usr/monitor 

上述代码执行效果如下图所示:

图26查看monitor文件

结果显示,局域网内只有172.16.40.208的主机开启了FTP服务,实验结束。


总结

这篇文章介绍了如何使用 Shell 脚本实现局域网 MAC 地址收集和 FTP 服务监控。作者首先介绍了 Shell 脚本的基本语法和常用命令,然后详细讲解了如何使用 Shell 脚本实现局域网 MAC 地址收集和 FTP 服务监控。在局域网 MAC 地址收集方面,使用了 arp 命令和 awk 命令,通过 Shell 脚本实现了对局域网中所有主机的 MAC 地址的收集和存储。在 FTP 服务监控方面,使用了 nc 命令和 while 循环,通过 Shell 脚本实现了对 FTP 服务的监控和报警。最后,总结了 Shell 脚本实现局域网 MAC 地址收集和 FTP 服务监控的方法和步骤,并给出了完整的 Shell 脚本代码。

猜你喜欢

转载自blog.csdn.net/m0_72471315/article/details/130187276