使用tshark抓包以及使用scp在Linux主机之间进行定时备份

来源:互联网 发布:百度大数据研究院 编辑:程序博客网 时间:2024/06/05 19:50

在远端有台主机要24小时不停的进行抓包,高峰时候流速野蛮大的,平均达到5.5M/s.但是这台主机的硬盘只有80G大小,撑不了多久就满了。所以需要将这台机器上的数据包scp到本地上来。所以要写一个简单的shell脚本实时scp回来。

       1.通过秘钥实现scp不输入密码传送文件 有些时候,我们在复制/移动文件到另一台机器时会用到scp,因为它比较安全。但如果每次都要输入密码,就比较烦了,尤其是在script里。不过,ssh有另一种用密钥对来验证的方式。下面写出我生成密匙对的过程,供大家参考。
第一步:生成密匙对,我用的是rsa的密钥。使用命令 "ssh-keygen -t rsa"
CODE:[Copy to clipboard]   [user1@rh user1]$ ssh-keygen -t rsa
   Generating public/private rsa key pair.
   Enter file in which to save the key (/home/user1/.ssh/id_rsa):
   Created directory ’/home/user1/.ssh’.
   Enter passphrase (empty for no passphrase):
   Enter same passphrase again:
   Your identification has been saved in /home/user1/.ssh/id_rsa.
   Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
   The key fingerprint is:
   e0:f0:3b:d3:0a:3d:da:42:01:6a:61:2f:6c:a0:c6:e7 
user1@rh.test.com
   [user1@rh user1]$
生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。接着会提示输入一
个不同于你的password的密码,直接回车,让它空着。当然,也可以输入一个。(我比较懒,不想每次都要输入密码。) 这样,密钥对就生成完了。其中公共密钥保存在 ~/.ssh/id_rsa.pub私有密钥保存在 ~/.ssh/id_rsa
然后改一下 .ssh 目录的权限,使用命令 "chmod 755 ~/.ssh"
CODE:[Copy to clipboard]   [user1@rh user1]$ chmod 755 ~/.ssh
   [user1@rh user1]$
之后把这个密钥对中的公共密钥复制到你要访问的机器上去,并保存为 ~/.ssh/authorized_keys.
CODE:[Copy to clipboard]   [user1@rh user1]$ scp ~/.ssh/id_rsa.pub rh1:/home/user1/.ssh/authorized_keys

这个时候你scp从远端拷贝数据回来的时候,就不需要密码了。

  2.在远端机器上使用tcpdump进行抓包,有关tcpdump的命令,网上有详细教程。但是tcpdump命令中抓取数据包只能按数据包数目和数据包的大小来进行抓取,无法按时间来抓取,比如说我想抓10分钟流量的数据包,tcpdump就干不了。于是乎,就找到了另一个工具tshark,它是wireshark在Linux上的应用。tshark可以按时间大小进行抓取数据包

。其中有一个命令 -a duration 100,表示抓取100秒的数据包,之后就结束。-b duration 100,表示抓取100秒的数据包,继续抓取100秒的数据包,一直抓下去,而且命名都很规范。有关tshark的命令,网上有资料。下面是我抓取10分钟流量的数据包的命令:

       tshark -i p3p1 -s 65535 -w "/home/weidou_data/wd" -b duration:600

在p3p1网口抓取数据包,这基本数据包的大小为65535,放在/home/weidou_data目录下,10分钟间隔。下面是文件的命名,它是按时间自动命名的,例如wd_00130_20141107121008,看到wd是我在命令中加的,00130是序列号,表示这是第130个文件了,20141107121008表示日期,2014年11月7号,12点10分08秒。下一个文件名:  wd_00131_20141107122008,10分钟间隔,一次类推。所以你要查看莫一天的某一个时段的数据包就很好找了!

                                         

还需要在远端机器上用crontab写一个定时查看tshark是否在运行的守护脚本,防止tshark意外中断了,一分钟执行一次,脚本很简单,就几行代码

APP="T_shark.sh"
APP_PATH="/root/tshark_code"
app_info=`ps -Aw | grep $APP`

if [ -z "$app_info" ]; then
    echo "APP not exit"
    $APP_PATH/$APP &
fi


3.在本地写一个shell脚本scp远端的数据包放到本地机器上。本地的机器上新安装了两个1T的硬盘,至于怎么在Linux上挂载新硬盘,详细看这个教程http://zwkufo.blog.163.com/blog/static/258825120141283942244/。

由于远端不停的抓取数据包,而本地又要从远端scp这些数据包文件。这就有一个问题,只能是scp已经抓取完的文件,并且删除它。不能scp正在抓取的文件。比如一个文件wd_00131_20141107122008,它表明在12点20开始抓取的数据包,假如现在时间是12点25,那就不能scp回来,因为这个文件还在不停的写入数据。所以只能等到12点30分08秒之后才能scp回来。

这就涉及到一个命令stat,一个文件有3个时间,访问时间,修改时间,状态修改时间。关于stat命令。如果一个文件不停的的在修改文件内容,那么修改时间就不停的在变化。所以我可以根据一个文件的修改时间与当前机器上的时间进行比较,如果两者相差2分钟以上,2分钟是我保险起见,就可以判断这个文件已经写完了,没有再变化了。这个时候就可以scp这个文件了,scp完后再删除它,这样远端的80G硬盘就不会满了。撑死了就达到了30%的使用率,因为数据包不停的在scp到本地,而且scp完后还删除了它。

    以下scp代码:

    

    file_dir=`ssh root@**.**.**.** "cd /home/data;ls"`

    for file in $file_dir

    do

    stat_time=`ssh root@**.**.**.** "stat /home/data/$file | grep Modify"`
    stat_time=`echo $stat_time | awk '{print$2}'`
    st_file_d=${stat_time##*-}
    st_file_d=`expr $st_file_d + 0`


    stat_time=`ssh root@**.**.**.** "stat /home/data/$file | grep Modify"`
    stat_time=`echo $stat_time | awk '{print$3}'`
    stat_time=${stat_time%:*}


    st_file_h=${stat_time%:*}
    st_file_h=`expr $st_file_h + 0`


    file_my_m=${stat_time##*:}
    file_my_m=`expr $file_my_m + 0`
    echo $st_file_h$file_my_m

    

       #当前系统时间
      cut_d=`ssh root@**.**.**.** "date "+%d""`
      cut_d=`expr $cut_d + 0`
      cut_h=`ssh root@**.**.**.** "date "+%H""`
      cut_h=`expr $cut_h + 0`

       cut_m=`ssh root@**.**.**.** "date "+%M""`
       cut_m=`expr $cut_m + 0`


      min_ch=$[cut_d*24*60+cut_h*60+cut_m-st_file_d*24*60-st_file_h*60-file_my_m]

      if [ $min_ch -ge 2 ];then

      echo "可以scp"
        scp root@**.**.**.**:/home/data/$file  $local_dirb
        echo "可以delete"
        ssh root@**.**.**.** "rm /home/data/$file"

      fi

   done

本地机器上也要搞一个crontab定时查看scp脚本是否在运行的shell脚本,和上面的守护脚本一样,每隔1分钟执行一次。

根据观察,远端机器在每天中午高峰期就硬盘使用率达到最大值25%,因为tshark抓取的速度很大,有6M/s,而scp的速度就600kb/s,其他时间用盘使用率7%左右。

0 0
原创粉丝点击