2个小时拿下Perl语言:自动监控服务器内网站访问ip次数并预警(附源码)

2个小时拿下Perl语言:自动监控服务器内网站访问ip次数并预警(附源码),第1张

概述[作者] 网名: 猪头三 站点: http://www.x86asm.com Email: pliceman_110@163.com QQ: 643439947 编程生涯: 2001~至今[2014年] 职业生涯: 11年 开发语言: C/C++; x86asm; Object Pascal; Object-C; C#; 开发工具: VC++; Delphi; 研发领域: Windows应用软件安 [作者] 网名: 猪头三 站点: http://www.x86asm.com Email: pliceman_110@163.com QQ: 643439947 编程生涯: 2001~至今[2014年] 职业生涯: 11年 开发语言: C/C++; x86asm; Object Pascal; Object-C; C#; 开发工具: VC++; Delphi; 研发领域: windows应用软件安全; windows系统内核安全; windows系统磁盘数据安全; 技能种类: 逆向 驱动 磁盘 文件 [序言] 一直都不是linux服务器专业人员. 但恰恰自己又拥有2台国外服务器,上面有好多关于我国外软件的产品网站. 这2台服务器每天都遭受各种第3世界国家攻击以及主流国家恶意爬虫和wp_login.PHP攻击. 每次维护一次访问日记都需要1个多小时,很麻烦. 再一个linux命令苦涩难懂,勉强会用几个,但还是不顶用. 就在前几天心烦了,干脆自己写脚本解析日记算了. 就这个念头一闪,就诞生了这个perl脚本出来. [学习] perl语言认真看2个小时,然后再mac os x系统装上eclips+perl插件就开工了(备注: 不会用vi,因为人笨),断断续续用了2天时间终于完成了第一个版本,大约700多行. 在开发过程中,其实很简单: 就是把C语言的逻辑思维转换成perl代码. 为什么要这样做,因为脚本语言通病就是语法糖过多,会让你迷失在语法糖里面而无法写出正常的程序,不是每个开发人员有拥有那种开发语言的天赋(备注:我个人认为只有这样的天赋才能接受各种奇怪的语法糖). 也就是一直坚持这个原则才让这个perl脚本诞生. [差异] perl和python都很好上手,只要你有C语言基础,玩这个很简单. 比Js简单多了. 那我为什么用perl呢?其实是我的服务器默认没有安装python,倒反默认安装了ruby,比较神奇. 本来想用ruby的,因为我第一个脚本语言就是ruby,但是后来想想linux服务器一般大头都是perl语言,因此选择了perl而不是ruby. [源码] #!usr/bin/perl #access-log #     ip访email #      # http://www.x86asm.com #: v0.0.1  #: 2014-07-15 #linux, #     . #使linuxcrontab -e # BEGIN  {    push  @ INC , "/Users/PigheadThree/perl5/lib/perl5"  ; } #use 5.010; use   strict  ; use   autodIE ; use   Try :: Tiny ; use   TIE :: file ; use   Fcntl   'O_RDONLY'  ; use   file :: Spec :: Functions   qw ( rel2abs ) ; use   file :: Basename   qw ( dirname   basename ) ; use   file :: Spec ; use   file :: copy   qw ( copy ); use   MIME :: lite  ; use   MIME :: Base64 ; use   Authen :: SASL :email #=================================== #=================================== #()() my   $g_str_App_Flag   =   'pht_monitor'  ; #access-logsGooglebing() #Google bingipip my   $g_str_grep_Bot   'Googlebot|bingbot'  ; #ip访() my   $g_int_limit_VisitIp   =   900  ; #() my   $g_str_Servername   "PHT Server"  ; #email() my   $g_str_email_From   'xxxxxxx@163.com'  ; my   $g_str_email_Pass   'xxxxxxx'          ; my   $g_str_eamil_Smtp   'smtp.163.com'     ; my   $g_str_eamil_To     'xxxxxxx@qq.com'   ; #=================================== try {      & fun_RunningLog ( "main() start..." ) ; & main () ; "main() end." ) ; catch "===========main() running error===========" ) ;      }; sub   main ()      # www.x86asm.com # #: x86asm #x86asm.com, #/home/x86asm/access-logs/x86asm.com #ip访      my   $str_Site_URL           "www.x86asm.com"  ; my   $str_Site_name          "x86asm_"  ; my   $str_Site_LogfilePath   "/home/x86asm/access-logs/x86asm.com"  ;      fun_CountTargetSite ( $str_Site_URL                          $str_Site_name                          $str_Site_LogfilePath ) ;                                } #End main()                    #======================================= #ip访 #param_1 :  #param_2 :  #param_3 : access_log  sub   fun_CountTargetSite ()      #0 if  (@ _   !=   3 )     {           return   0  ;     }     ( my   $str_param_Site_URL       my   $str_param_Site_name my   $str_param_Site_LogfilePath =  @ _  ; my   % hash_VisitIp_Count  ; "[$str_param_Site_URL] : start..." ); & fun_GetVisitIp ( $str_param_Site_LogfilePath                          $g_int_limit_VisitIp                          & fun_GetLocaltime ( "/" ) \% hash_VisitIp_Count ) ; if  ( & fun_IsNeedUpdate ( $str_param_Site_name .& fun_GetLocaltime ( "_" ) . ".txt"                                 \% hash_VisitIp_Count eq   1 )                   #          & fun_VisitIpSavetoCurrentPathfile ( $str_param_Site_name                                                   \% hash_VisitIp_Count );           #EMAIL           my   $str_SendEmail_Data   =   & fun_GetSendEmailToData ( $str_param_Site_name ".txt" ) ; if  ( $str_SendEmail_Data   ne   0 )          {               & fun_autoSendEmailToAlarm ( $g_str_Servername "[$str_param_Site_URL]" "Alarm Ip Visit"                                         $str_SendEmail_Data ) ;          }           else     }     "[$str_param_Site_URL] : end." ); # End fun_CountTargetSite()  # #param_1 :  sub   fun_GetLocaltime () # % hash_montoname   =  (           "01"   =>   "Jan" "02"   "Feb" "03"   "Mar" "04"   "Apr" "05"   "May" "06"   "Jun" "07"   "Jul" "08"   "Aug" "09"   "Sep" "10"   "Oct" "11"   "Nov" "12"   "Dec" ) ; my  ( $sec $min $hour $mday $mon $year_off $wday $yday $isdat =   localtime ;          ( $mday   $mon   $year_off sprintf ( "%02d"   $mday )   $mon +1 )           $year_off +1900 ); #      $mon   =   $hash_montoname { $mon } ;      return   $mday . $_ [ 0 ] . $mon . $year_off ;                # End fun_GetLocaltime() # sub   fun_GetLocaltimetoLog () # if  (@ _ ) my  @ array_montoname   =   qw ( Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec ) ;          ( $sec   $min   $hour   $mday   $sec )   $min )   $hour ) =   $array_montoname [ $mon ] ; '/' . $year_off '  ' . $hour ':' . $min . $sec  ;   # End fun_GetLocaltimetoLog() # #param_1 :  sub   fun_RunningLog () #0 my   $str_param_Print # my   $str_LogTime   '[' .& fun_GetLocaltimetoLog () ']'  ; # my   $str_Log_filename   'run_' '_' ) '.txt'  ;      $str_Log_filename      =   file :: Spec -> join ( & fun_GetCurrentAppPath ()                                              $str_Log_filename ) ;                                              unless ( - e   $str_Log_filename ) unless ( open ( HANDLE_OPEN   ">$str_Log_filename" ))                ">>$str_Log_filename" )) # print   HANDLE_OPEN   $str_LogTime ' : ' . $str_param_Print "\n"  ; close ( HANDLE_OPEN ) ; 1  ; #End fun_RunningLog() # sub   fun_GetCurrentAppPath () return   dirname ( rel2abs ( __file__ )) ; # End fun_GetCurrentAppPath() # #param_1 :  sub   fun_copyfileToCurrentAppPath () my   $str_copyfiletopath   ""  ; my   $str_copyfilename     my   $str_CurrentAppPath   my   $str_param_copyfilePath   =   $_ [ 0 ] ; # -e   -d  - e   $str_param_copyfilePath )                #()                $str_CurrentAppPath   & fun_GetCurrentAppPath () ;                $str_copyfilename     =   basename ( $str_param_copyfilePath ) ;                $str_copyfiletopath   join ( $str_CurrentAppPath   $str_copyfilename ) ;                - e   $str_copyfiletopath )               {                     #                     if  ( $str_copyfiletopath   =~   /$g_str_App_Flag/i )                    { "fun_copyfileToCurrentAppPath() deleteing $str_copyfiletopath..." ) ;                          unlink ( $str_copyfiletopath ); "fun_copyfileToCurrentAppPath() deleted $str_copyfiletopath." ) ;                        }               }                copy ( $str_param_copyfilePath   $str_copyfiletopath ) ; return   $str_copyfiletopath  ; # End fun_copyfileToCurrentAppPath() #ip sub   fun_GetIpByStr () my   $str_param_Target if  ( $str_param_Target   /(\d+\.\d+\.\d+\.\d+)/ ) return   ""  ;  #IP # End fun_GetIpBystr() #ip访 #param_1 : 访 #param_2 : IP访 #param_3 : 访 (02/jul/2014) #param_4 :   sub   fun_GetVisitIp () 4 ) # my   $str_param_VisitIp_LogfilePath my   $int_param_VisitIp_Count my   $time_param_Get my   $hash_param_VisitIp       if  ( $time_param_Get   eq   "NO" )           $time_param_Get   "/" ) ; # - e   $str_param_VisitIp_LogfilePath ) my   $str_VisitIp_copytopath   & fun_copyfileToCurrentAppPath ( $str_param_VisitIp_LogfilePath ) ; if  ( $str_VisitIp_copytopath   eq   # # my  @ array_VisitIp_Load  ; my   $int_VisitIp_filelineNums  ; - e   $str_VisitIp_copytopath ) tIE  @ array_VisitIp_Load                    'TIE::file'                    $str_VisitIp_copytopath                    mode   =>   O_RDONLY  ;                    #                 $int_VisitIp_filelineNums   =  @ array_VisitIp_Load   -   # my   $str_Temp_line            my   $str_Temp_VisitIp         my   $str_Temp_VisitIp_Count   0   ; % hash_Temp_VisitIp        =  () ; while  ( $int_VisitIp_filelineNums   >=                       $str_Temp_line   =   $array_VisitIp_Load [ $int_VisitIp_filelineNums ] ; if  ( $str_Temp_line   /$time_param_Get/i )                          /$g_str_grep_Bot/i )                        {                                                    }                         @H_607_4035@                             #ip                             $str_Temp_VisitIp   & fun_GetIpByStr ( $str_Temp_line ) ;                             if  ( $str_Temp_VisitIp   eq                              {                            }                                 #ip访()                                 if  ( exists   $hash_Temp_VisitIp { $str_Temp_VisitIp })                                {                                     $hash_Temp_VisitIp { $str_Temp_VisitIp +=                                                                           #,                                     if  ( $hash_Temp_VisitIp { $str_Temp_VisitIp >=   $int_param_VisitIp_Count )                                    {                                                                                 exists   $$hash_param_VisitIp { $str_Temp_VisitIp })                                          {                                               $$hash_param_VisitIp { $str_Temp_VisitIp 1  ;                                            }                                           =   $int_param_VisitIp_Count  ;                                                        }                                }                                 last  ;                                         $int_VisitIp_filelineNums   -=   1  ;  # untIE  @ array_VisitIp_Load  ;  1  ;              "fun_GetVisitIp() $str_param_VisitIp_LogfilePath no found." ) ; # End fun_GetVisitIp() # #param_1 :  #param_2 :  sub   fun_VisitIpSavetoCurrentPathfile () 2 ) my   $str_param_Savetofilename my    $hash_param_Conent # if  (( length ( $str_param_Savetofilename ==   0 or        (( keys   % $hash_param_Conent 0 )) # my   $str_SavetofilePath                                 $str_param_Savetofilename ) ; - e   $str_SavetofilePath ) if  ( $str_SavetofilePath                  "fun_VisitIpSavetoCurrentPathfile() deleteing $str_SavetofilePath..." ) ; unlink ( $str_SavetofilePath ); "fun_VisitIpSavetoCurrentPathfile() deleted $str_SavetofilePath." ) ; open ( HANDLE_file ">$str_SavetofilePath" )) my   $hash_Keys  ; my   $hash_Values  ; foreach   $hash_Keys  ( sort   % $hash_param_Conent )                $hash_Values   =   $$hash_param_Conent { $hash_Keys } ; print   HANDLE_file   "$hash_Keys => $hash_Values \n"  ; close ( HANDLE_file ) ; # End fun_VisitIpSavetoCurrentPathfile() #(.txt) sub   fun_IsNeedUpdate () my   $str_param_filename length ( $str_param_filename        ( % $hash_param_Conent   my   $bool_IsNeedUpdate   0  ;  # my   $str_Ip   % hash_Load_Ip  ; my   $str_OpenfilePath                                                $str_param_filename ) ; #ip - e   $str_OpenfilePath ) open  ( HANDLE_OPEN   $str_OpenfilePath )) while ( my   $str_Temp_line   < HANDLE_OPEN > )                     $str_Ip   if  ( $str_Ip   eq                    {                  }                   @H_607_4035@                       ip                       $hash_Load_Ip { $str_Ip 1  ;     close ( HANDLE_OPEN ); # my   $str_Temp_Value  ; while (( $str_Ip   $str_Temp_Value each   #ip1                  exists   $hash_Load_Ip { $str_Ip })                 {                                      }                      $bool_IsNeedUpdate                        @H_607_4035@                 }             }    #           $bool_IsNeedUpdate   return   $bool_IsNeedUpdate  ; # End fun_IsNeedUpdate() #email #param_1 :  #param_2 :  sub   fun_autoSendEmailToAlarm () my   $str_param_Subject my   $str_param_Data length ( $str_param_Subject         ( length ( $str_param_Data ==    0 ))       {          0      }  my   $msg_Send   =   MIME :: lite -> new ( From      =>   $g_str_email_From                                        To        =>   $g_str_eamil_To                                        Subject   =>   $str_param_Subject                                        Data      =>   $str_param_Data ) ; #$msg_Send->attr("content-type" => "text/HTML") ;      $msg_Send send ( "smtp"   $g_str_eamil_Smtp                      AuthUser => $g_str_email_From                      AuthPass => $g_str_email_Pass                      Timeout   =>   30 ) ;  # DeBUG => 1        # End fun_autoSendEmailToAlarm() #email #param_1 :  () sub   fun_GetSendEmailToData () my   $str_param_filename # my   $str_Content                       chomp ( $str_Temp_line ) ;                     $str_Content   .=   $str_Temp_line   .=   "\n"   ; length ( $str_Content return   $str_Content  ;    # End fun_GetSendEmailToData() 总结

以上是内存溢出为你收集整理的2个小时拿下Perl语言:自动监控服务器内网站访问ip次数并预警(附源码)全部内容,希望文章能够帮你解决2个小时拿下Perl语言:自动监控服务器内网站访问ip次数并预警(附源码)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1276255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存