2017-09-06 14 views
0

ファイアウォールからsyslogデータをダンプし、私の家の特定のIPに接続する接続を一致させたい。私は以下のコードを使用しています。以下のコードはすべてのデータを収集していますが、私のIF文は決して一致しません。私はunicodeなしで試してみました.'192.168.1.1 'で、抽出されたIPを出力しただけでは表示されません。下の出力を参照してください。 Pythonの2.7にPythonでREを使用してSyslogデータを解析する

#!/usr/bin/env python 

## Tiny Syslog Server in Python. 
## 
## This is a tiny syslog server that is able to receive UDP based syslog 
## entries on a specified port and save them to a file. 
## That's it... it does nothing else... 
## There are a few configuration parameters. 

LOG_FILE = 'youlogfile2.log' 
HOST, PORT = "192.168.1.2", 514 

# 
# NO USER SERVICEABLE PARTS BELOW HERE... 
# 

import logging 
import SocketServer 
import re 
server = u'192.168.1.254' 

logging.basicConfig(level=logging.INFO, format='%(message)s', datefmt='', filename=LOG_FILE, filemode='a') 

class SyslogUDPHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 

     data = bytes.decode(self.request[0].strip()) 
     socket = self.request[1] 
     ipDST = re.compile(r'dst=([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)') 
     ipDSTExtracted = ipDST.findall(data) 
     #print (ipDSTExtracted) 
     if ipDSTExtracted == server: 
      print (ipDSTExtracted) 

     #print("%s : " % self.client_address[0], str(data)) 
     logging.info(str(data)) 

if __name__ == "__main__": 
    try: 
     server = SocketServer.UDPServer((HOST,PORT), SyslogUDPHandler) 
     server.serve_forever(poll_interval=0.5) 
    except (IOError, SystemExit): 
     raise 
    except KeyboardInterrupt: 
     print ("Crtl+C Pressed. Shutting down.") 

}

を使用して、私は私が見てアイドルと文字列バージョンでテストしているのかもしれないカッコ

[u'8.8.8.8'] 
[u'8.8.8.8'] 
[u'192.168.1.254'] 
[u'8.8.8.8'] 
[u'8.8.8.8'] 
[u'8.8.8.8'] 
[u'192.168.1.254'] 
[u'8.8.8.8'] 
[u'192.168.1.209'] 
[u'8.8.8.8'] 
[u'192.168.1.26'] 
[u'8.8.8.8'] 
[u'8.8.8.8'] 

もしわからないこの出力で試合の多くを得たが、イムユニコードのバージョンはお互いに一致しますが、この設定では動作しません。

+0

Python 2または3を使用していますか? –

+0

大括弧は出力がリストであることを示します。それは決して単一の文字列と一致しません。 ( 'findall(...)'がリストを返すので)代わりに 'ipDSTExtracted [0]'を使うことができます。しかし、あなたのコードを見ると、どこにも定義されていない 'mediasite'と比べて、最初に比較していることを理解できません。 – Evert

+0

ipDSTExtracted [0]とipDSTExtracted [0] == serverの場合は、1回一致してから範囲外のエラーが発生し、ただそれを続けます。 – turtle02

答えて

1

findallはリストを返します。リスト(findallの結果)と文字列(これはあなたのmediasiteの内容であると仮定しています)と比較すると、もちろん比較は常に偽になります。

おそらく、変数を各要素の返品と比較する場合は、findallとします。次のようなもの:

for ip in ipDST.findall(data) 
    if ip == mediasite: 
     print (ipDSTExtracted) 
+0

これは私にとってはうまくいかないようでした。 – turtle02

+0

あなたは 'mediasite'が実際に何を含んでいるのか、サンプル入力データを提供してくれていないので、物事を検証するのは難しいです。しかし、 'ipDST.findall(data)'が何かを返すならば、ループの残りの部分で何が起こっているのか把握できなければなりません。 *何も返さない*の場合、正規表現に問題があります。 – larsks

+0

私はあなたのためのコードを編集した事故だったmediasiteはありません。 ipDST.findallでipのためにこれを使用して – turtle02

関連する問題