2017-09-06 48 views
0

我從我的防火牆轉儲系統日誌數據,並希望匹配去我家的特定IP的連接。我正在使用下面的代碼。下面的代碼儘可能收集所有的數據,但我的IF語句永遠不會匹配。我試過沒有unicode u'192.168.1.1',沒有,如果我只是打印提取的IP,它顯示出來 - 見下面的輸出。使用Python 2.7在python中使用RE的系統日誌數據解析

#!/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'] 

我在空閒的測試支架看到和字符串版本和unicode版本將相互匹配,但它似乎不適用於此設置。

+0

你使用的是Python 2還是3? –

+0

方括號表示您的輸出是一個列表;那永遠不會匹配單個字符串;你可能想使用'ipDSTExtracted [0]'來代替(因爲'findall(...)'返回一個列表)。然而,看看你的代碼,你會比較'mediasite',這是沒有定義的,所以我不明白你在比較什麼。 – Evert

+0

我弄亂了變量它只是服務器,而不是mediasite - 但是使用ipDSTExtracted [0],如果ipDSTExtracted [0] ==服務器:沒有u'匹配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

有沒有媒體是我爲你編輯代碼的事故。 – turtle02