shell编程

  • 格式:docx
  • 大小:348.32 KB
  • 文档页数:6

1. SHELL脚本编程
1.1 实验目的
shell脚本编程,生成TCP活动状况报告
1.2 实验要求
netstat --statistics --tcp命令可以列出tcp统计信息。

编写shell脚本程序,每隔1分钟生成1行信息:
当前时间;
这一分钟内TCP发送了多少报文;
接收了多少报文;
收发报文总数;
行尾给出符号+或-或空格(+表示这分钟收发报文数比上分钟多,收发报文数相同用空格,否则用符号-)。

运行示例如下:
1.3 实验环境
VMare虚拟机+ Ubuntu编辑器
1.4 实验分析及过程
1.4.1 实验分析
首先,我们需要得到的最终结果为:2018-05-17 00:00 123 123 123;
1.每分钟生成一行信息:采用while循环,每分钟输出一次
2.时间输出:格式为2018-05-17 00:00
date +"%F %H:%M";
3.获取tcp发送和接收的报文数量:
先用netstat --statistics –-tcp查看格式,
然后在相应格式中筛选出数据
4.将获取的报文数量数据格式化为123 123 123 类似的输出格式
5.最后考虑行尾的+-符号:经过比较根据不同结果给出对应符号
1.4.2 每分钟获取一行数据
每分钟生成一行信息:采用while循环,每分钟输出一次
While true
do echo “xxx”
sleep 60
done;
结果如下:
1.4.3 时间输出
时间输出:格式为2018-05-17 00:00
date +"%F %H:%M";
结果如下:
1.4.4 Net文件下载
1.在进行tcp获取包数量之前,我们遇到了nettool未安装bug,需要进行net安装,如下图:
需要写入sudo apt-install net-tools命令下载
2.输入相应命令下载我们发现,E不能获取相应的包文件
3.经过网上查阅,我们需要将apt的包进行删除并且重新强制更新,使用ps –a|grep apt查看相
应的线程
4.删除由上面查看的线程:使用# sudo kill processnumber 获取权限
并用sudo kill+number删除相应线程
5.还是不能进行安装,需要进行包更新
6.使用sudo apt update更新包
7.最后重新进行netools的安装,安装成功。

便可以使用我们需要的命令了。

1.4.5 获取tcp发送和接收的报文数量
1.首先用netstat --statistics –-tcp;查看命令格式:
2.我们发现,我们需要的tcp数据在第14/15行(上图已经标记),因此我们需要使用
awk命令将第14/15行的数据提取出来:
num1=$(netstat --ststistics --tcp|awk 'NR==14,NR==15{print $1}')
3.由于我们获得的是从0到现在所有的报文数量,因此需要前一分钟和后一分钟的差
值来求出这一分钟内的报文数量,即需要在一个while循环中获取前一分钟的数据
和后一分钟的数据:
while true
do
//前一分钟数据
num1=$(netstat --statistics --tcp|awk 'NR==14,NR==15{print $1}')
receive1=$(echo $num1|awk'{print $1}')
send1=$(echo $num1 |awk'{print $2}')
sleep 60
//后一分钟数据
time=$(date +"%F %H:%M")
num2=$(netstat --statistics --tcp|awk 'NR==14,NR==15{print $1}')
receive2=$(echo $num1|awk'{print $1}')
send2=$(echo $num1 |awk'{print $2}')
//取差值作为一分钟内的数据
receive=$(expr $receive2 - $receive1)
send=$(expr $send2 - $send1)
permin2=$(expr $receive + $send)
1.4.6 行尾的+-符号
1.我们已经获取了当前分钟的报文数量,但是需要和上一分钟内的报文数量进行比较,因此
我们需要额外存储当前的数据到下一分钟
2.在比较时需要用到gt大于比较,eq等于比较,剩下的是小于比较
if[$permin2 - gt $permin1]
then echo $time $send $receive $permin2 +
elif[$permin2 -eq $permin1]
then echo $time $send $receive $permin2
else echo $time $send $receive $permin2 –
1.4.7 最终代码
permin1=0
lastone=''
while true
do
num1=$(netstat --statistics --tcp | awk 'NR==10,NR==11{print $1}')
receive1=$(echo $num1 | awk '{print $1}')
send1=$(echo $num1 | awk '{print $2}')
sleep 2
time=$(date +"%F %H:%M:%S")
num2=$(netstat --statistics --tcp | awk 'NR==10,NR==11{print $1}')
receive2=$(echo $num2 | awk '{print $1}')
send2=$(echo $num2 | awk '{print $2}')
receive=$(expr $receive2 - $receive1)
send=$(expr $send2 - $send1)
permin2=$(expr $receive + $send)
if [ $permin2 -gt $permin1 ]
then lastone='+'
elif [ $permin2 -eq $permin1 ]
then lastone=''
else lastone='-'
fi
echo $time $send $receive $permin2 $lastone
permin1=$permin2
done
变量说明:
Num1: 获取前一秒原始tcp报文数量数据Num2: 获取当前原始tcp报文数量数据Time:获取当前时间lastone:最后的行尾+-
Permin1:前一秒内总报文数量permin2:当前秒内总报文数量
Send1:前一秒内发送报文数量send2:当前秒内发送报文数量
Receive1:前一秒内接收报文数量receive2: 当前秒内接收报文数量
1.4.8 写入.sh文件
将源代码写入.Sh文件,我命名为test.sh
用chmod u+x test.sh打开test.sh
用./test.sh运行test.sh,执行命令
1.4.9 运行结果
1.5 实验总结
实验中练习了在终端通过Vim编辑器编写代码,进一步熟悉了通过指令在终端直接调试和运行代码。

在脚本编程的过程中,由于对相关的指令不够熟悉,遇到了很多问题,但通过对这些问题的研究和解决使我巩固了对UNIX常用命令的功能的使用。

同时也学会看帮助文档,和查找所需要的资料。

此次实验依然有一个不是很完美的地方,我们利用awk挖掘出收发报文数量时,使用了“awk 'NR==12,NR==13{print $1}'”这条语句,其中的NR==12和NR==13,是我们用来指定挑选出netstat输出中的第12和第13条语句,这正是我们所需的报文数据所在的行数,虽然这样写可以简化编程过程,但是有些担心脚本的移植性问题。