最近有感於C++處理字串能力的不足,所以跳槽寫一下Perl
這篇文章是一個具有C++基礎,以及會簡單PHP的人所寫的筆記,
目的是讓只會C++的人快速看懂一些關鍵語法

由於原PO也只是Perl剛摸兩天的初心者,若有錯誤或者是寫法傷眼,還請海涵

這篇來實做一個auth.log分析程式,用途是分析FreeBSD的登入log資料,
可以把多次錯誤的使用者加入防火牆規則中擋下來,

先貼出完整原始碼,再來慢慢討論




#!/usr/bin/perl
$ban_limit=3;
while(<>)
{
  $t=$_;
  open(fin,">>/var/log/PG_auth.log");
  if($t =~ /error: PAM: authentication error for ([A-Za-z._]+) from (.+)/)
  {
    print fin `date`.$1." passwd ERROR at ".$2."\n";
  }
  if($t =~ /Failed keyboard-interactive\/pam for (|invalid user )([A-Za-z._]+) from (.+) port */)
  {
    $reg1=$1; $reg2=$2; $reg3=$3;
    if($reg1 =~ /invalid user/)
    {
      open(fin2,">>/var/log/PG_err_try.log");
      print fin2 "Ban $reg3 \n";
      close fin2;
    }
    
$test{$reg3}++;
    if($test{$reg3}>$ban_limit)
    {
      $cmd="ipfw -q add deny all from $reg3 to me 21,22,23\n";
      print fin "Ban $reg3 \n";
      print `$cmd`;
    }  
  }
  if($t =~ /Accepted keyboard-interactive\/pam for ([A-Za-z._]+) from (.+) port .+/)
  {
    open(fin2,">>/var/log/PG_err_try.log");
    print fin2 "Unlock $2 \n";
    close fin2;
    $test{$2}=-3;
  }
  close fin;
}

 

 

 

一開始while(<>) 是while(<stdin>)的簡略,
可以不斷的從stdin這個資料流中 讀取資料,存到預設變數 $_
因此迴圈一開始我們就用$t=$_; 保存變數結果

 open(fin,">>/var/log/PG_auth.log");
是寫入檔案操作,>> 代表附加 >代表清空,這點和資料流重新導向一樣

if($t =~ /error: PAM: authentication error for ([A-Za-z._]+) from (.+)/)
代表正規表示法操作,Perl會將正規表示法裡面的()匹配到的字串,
依序存入$1 $2 $3 等預設變數裡面,
由於預設變數在下一次使用正規表示法的時候就會被換成新的結果,
所以我們可以先用$reg1=$1; $reg2=$2; $reg3=$3;
保存

 $test{$reg3} 代表Perl裡面的hash ,等價於C++ STL裡面的map,
記得要用{}操作hash就是..

print `$cmd`;
還記得嗎,``(反斜線)裡面的字串,會交由系統執行後,回傳執行後的結果

 

 

smartPG 發表在 痞客邦 PIXNET 留言(0) 人氣()