2012-11-29 2 views
0

나는 맥 주소에 따라 파이썬으로 dhcpd.lease에서 임대를 제거하려고하고있다. 23 : 18 : 62 : 31 : 5B 'python을 사용하여 dhcpd.leases에서주는 Mac을 제거 하시겠습니까?

이것은 I가 '00 부여하고

lease 10.14.53.253 { 
    starts 3 2012/10/17 09:27:20; 
    ends 4 2012/10/18 09:27:20; 
    tstp 4 2012/10/18 09:27:20; 
    binding state free; 
    hardware ethernet 00:23:18:62:31:5b; 
} 
lease 10.14.53.252 { 
    starts 3 2012/10/17 10:15:17; 
    ends 4 2012/10/18 10:15:17; 
    tstp 4 2012/10/18 10:15:17; 
    binding state free; 
    hardware ethernet 70:71:bc:c8:46:3c; 
    uid "\001pq\274\310F<"; 
} 

을 가정 해 보자 dhcpd.lease 예이다. 그럼이 임대 계약서에 속한 모든 전화 번호를 삭제해야합니다. 삭제 후 파일은 다음과 같아야합니다.

lease 10.14.53.252 { 
    starts 3 2012/10/17 10:15:17; 
    ends 4 2012/10/18 10:15:17; 
    tstp 4 2012/10/18 10:15:17; 
    binding state free; 
    hardware ethernet 70:71:bc:c8:46:3c; 
    uid "\001pq\274\310F<"; 
} 

나는 파일을 읽고 문자열을 넣을 수 있지만 그 후에 무엇을 해야할지 모릅니다. 이 정규식을 시도했지만 작동하지 않았다. 파일의 첫 번째 행만 검사했습니다.

fh = open(DHCPFILE) 
lines = fh.read() 
fh.close() 
m = re.match(r"(.*lease.*%s.*})" % mac ,lines) 

답변

1

이 문제는 정규 표현식 손톱 모양 하지, 그래서 아래로 그 망치를 넣어주십시오입니다.

올바른 도구는 내용을 파이썬 구조로 구문 분석하여 원하지 않는 항목을 필터링 한 다음 나머지 항목을 다시 작성하는 것입니다.

pyparsing은 구문 분석 작업을 쉽게 만듭니다. 다음은 an existing example을 기반으로합니다

from pyparsing import * 

LBRACE,RBRACE,SEMI,QUOTE = map(Suppress,'{};"') 
ipAddress = Combine(Word(nums) + ('.' + Word(nums))*3) 
hexint = Word(hexnums,exact=2) 
macAddress = Combine(hexint + (':'+hexint)*5) 
hdwType = Word(alphanums) 

yyyymmdd = Combine((Word(nums,exact=4)|Word(nums,exact=2))+ 
        ('/'+Word(nums,exact=2))*2) 
hhmmss = Combine(Word(nums,exact=2)+(':'+Word(nums,exact=2))*2) 
dateRef = oneOf(list(""))("weekday") + yyyymmdd("date") + \ 
                 hhmmss("time") 

startsStmt = "starts" + dateRef + SEMI 
endsStmt = "ends" + (dateRef | "never") + SEMI 
tstpStmt = "tstp" + dateRef + SEMI 
tsfpStmt = "tsfp" + dateRef + SEMI 
hdwStmt = "hardware" + hdwType("type") + macAddress("mac") + SEMI 
uidStmt = "uid" + QuotedString('"')("uid") + SEMI 
bindingStmt = "binding" + Word(alphanums) + Word(alphanums) + SEMI 

leaseStatement = startsStmt | endsStmt | tstpStmt | tsfpStmt | hdwStmt | \ 
                 uidStmt | bindingStmt 
leaseDef = "lease" + ipAddress("ipaddress") + LBRACE + \ 
          Dict(ZeroOrMore(Group(leaseStatement))) + RBRACE 

input = open(DHCPLEASEFILE).read() 
with open(OUTPUTFILE, 'w') as output: 
    for lease, start, stop in leaseDef.scanString(input): 
     if lease.hardware.mac != mac: 
      output.write(input[start:stop]) 

위의 코드는 간결 dhcp.leases 파일의 문법을 정의하고, 파일의 각 임대를 구문 분석 scanString()를 사용합니다. scanString()은 구문 분석 결과와 원래 문자열의 시작 및 끝 위치로 각각 구성된 일련의 일치를 반환합니다.

구문 분석 결과에 .hardware.mac 속성이 있습니다 (입력에 하드웨어 문이없는 경우에는 AttributeError 예외를 catch하여 제거하려는 MAC 주소를 쉽게 테스트 할 수 있습니다). MAC 주소가 일치하지 않으면 전체 임대를 startstop 위치를 사용하여 출력 파일에 쓰고 해당 임대의 원본 텍스트를 가져옵니다 (파싱 된 정보에서 임대 형식을 지정하는 것보다 훨씬 쉽습니다).

관련 문제