Я пытаюсь поменять местами адреса и префиксы источника и назначения / префиксы IP-списков доступа, которые я беру с существующей записью ACL и создаю запись в обратном направлении, как показано ниже:

Вход:

разрешить ip любому хосту 10.22.122.161

разрешить ip host 10.11.198.18 любой

разрешить ip host 10.22.122.161 192.168.150.16 0.0.0.7

разрешить ip host 10.22.122.161 host 10.22.122.255

разрешить ip любому хосту 10.22.122.255

allow ip 192.168.150.16 0.0.0.7 host 10.22.122.255

разрешить ip любой 192.168.150.16 0.0.0.7

разрешить ip 192.168.150.16 0.0.0.7 любой

разрешить ip любой 172.16.150.208 0.0.0.15

разрешить tcp любой 172.16.150.208 0.0.0.15

разрешение tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7

Ожидаемый выход:

разрешить ip host 10.22.122.161 любой

разрешить ip любому хосту 10.11.198.18

allow ip 192.168.150.16 0.0.0.7 host 10.22.122.161

разрешить ip host 10.22.122.255 host 10.22.122.161

разрешить ip host 10.22.122.255 любой

разрешить ip host 10.22.122.255 192.168.150.16 0.0.0.7

разрешить ip 192.168.150.16 0.0.0.7 любой

разрешить ip любой 192.168.150.16 0.0.0.7

разрешить ip 172.16.150.208 0.0.0.15 любой

разрешить tcp 172.16.150.208 0.0.0.15 любой

разрешение tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7

allow tcp 192.168.150.16 0.0.0.7 172.16.150.208 0.0.0.15

Но в некоторых случаях моя функция не может поменять местами источник и пункт назначения

Мои коды не проходят в следующих тестовых случаях:

разрешить ip host 10.22.122.161 192.168.150.16 0.0.0.7

Следующее регулярное выражение не соответствует 192.168.150.16 0.0.0.7 с (. *)

p = re.sub (r '(. ) (\ bany \ b | \ bhost \ b \ d {1,3}. \ d {1,3}. \ d {1,3}. \ d {1,3}) (. ) ', r' \ 1 \ 3 \ 2 ', ACELine)

#!/usr/bin/python3
import re

def ChangeACESrcDst(ACELine):
  ReversedACE = str()
  protocols_list = [
    'ip',
    'tcp',
    'udp',
    'gre',
    'icmp'
  ]
  if (bool(re.search(r'(\bpermit\b|\bdeny\b)',ACELine))):
    ACE_ITEMS = ACELine.split()
    if  ACE_ITEMS[1] in protocols_list:
      if len(ACE_ITEMS) == 5:
        if ACE_ITEMS[2] == 'host' or ACE_ITEMS[2] == 'any':
          p = re.sub(r'(.*)(\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)',r'\1\3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[4] == 'host' or ACE_ITEMS[4] == 'any':  
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      elif len(ACE_ITEMS) == 6: 
        if ACE_ITEMS[2] == 'host' and ACE_ITEMS[4] == 'host':
          p = re.sub(r'(.*) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
        else:
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      else:
        print(f'ERROR: ACE items length must be either 5 or 6 : {ACELine}')
    else:
      print(f'ERROR: Protocols not supported : {ACE_ITEMS[1]}') 
      exit() 
    print('\n')

  return ReversedACE


if __name__ == "__main__":
 aces = [
 'permit ip any host 10.22.122.161',
 'permit ip host 10.11.198.18 any',
 'permit ip host 10.22.122.161 192.168.150.16 0.0.0.7',
 'permit ip host 10.22.122.161 host 10.22.122.255',
 'permit ip any host 10.22.122.255',
 'permit ip 192.168.150.16 0.0.0.7 host 10.22.122.255',
 'permit ip any 192.168.150.16 0.0.0.7',
 'permit ip 192.168.150.16 0.0.0.7 any',
 'permit ip any 172.16.150.208 0.0.0.15',
 'permit tcp any 172.16.150.208 0.0.0.15',
 'permit tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7'
 ]
 for ace in aces:
   ace = (ChangeACESrcDst(ace))

Вход:

разрешить ip host 10.22.122.161 192.168.150.16 0.0.0.7

Ожидаемый выход:

allow ip 192.168.150.16 0.0.0.7 host 10.22.122.161

2
Behnam 7 Июл 2019 в 09:11

4 ответа

Лучший ответ

Фактическая проблема была с моей логикой if / else, решая которую, я получаю ожидаемый результат, я ищу более эффективный способ реализации моей функции

#!/usr/bin/python3.7
import re

def ChangeACESrcDst(ACELine):
  ReversedACE = str()
  protocols_list = [
    'ip',
    'tcp',
    'udp',
    'gre',
    'icmp'
  ]
  if (bool(re.search(r'(\bpermit\b|\bdeny\b)',ACELine))):
    ACE_ITEMS = ACELine.split()
    if  ACE_ITEMS[1] in protocols_list:
      if len(ACE_ITEMS) == 5:
        if ACE_ITEMS[2] == 'host' or ACE_ITEMS[2] == 'any':
          p = re.sub(r'(.*)(\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)',r'\1\3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[4] == 'host' or ACE_ITEMS[4] == 'any':  
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      elif len(ACE_ITEMS) == 6: 
        if ACE_ITEMS[2] == 'host' and ACE_ITEMS[4] == 'host':
          p = re.sub(r'(.*) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[2] == 'host' and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[4])) and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[5])):
          p = re.sub(r'(.*)(\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)',r'\1\3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[4] == 'host' and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[2])) and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[3])):
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)          
          print(ACELine)
          print(p)
        else:
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      else:
        print(f'ERROR: ACE items length must be either 5 or 6 : {ACELine}')
    else:
      print(f'ERROR: Protocols not supported : {ACE_ITEMS[1]}') 
      exit()

  return ReversedACE


if __name__ == "__main__":
 aces = [
 'permit ip any host 10.22.122.161',
 'permit ip host 10.11.198.18 any',
 'permit ip host 10.22.122.161 192.168.150.16 0.0.0.7',
 'permit ip host 10.22.122.161 host 10.22.122.255',
 'permit ip any host 10.22.122.255',
 'permit ip 192.168.150.16 0.0.0.7 host 10.22.122.255',
 'permit ip any 192.168.150.16 0.0.0.7',
 'permit ip 192.168.150.16 0.0.0.7 any',
 'permit ip any 172.16.150.208 0.0.0.15',
 'permit tcp any 172.16.150.208 0.0.0.15',
 'permit tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7'
 ]
 for ace in aces:
   ChangeACESrcDst(ace)

0
Behnam 8 Июл 2019 в 05:23

Ты можешь попробовать вот так

import re
host_ip_pos = re.search(r'host\s\d*.\d*.\d*.\d*', str1).span()
print(host_ip_pos)
(10, 28)

new_str = str1[:host_ip_pos[0]] + str1[host_ip_pos[1]+1:] + ' ' + str1[host_ip_pos[0]: host_ip_pos[1]]
print(new_str)
permit ip 192.168.150.16 0.0.0.7 host 10.22.122.161
0
nag 7 Июл 2019 в 06:35

Вы можете попробовать использовать регулярные выражения и f-строки следующим образом:

import re

def swap_ips(text: str) -> str:
    ip = r'\d+\.\d+.\d+.\d+'
    ip_pattern = f'(host {ip}) ({ip}) ({ip})'
    match = re.search(ip_pattern, text)
    host, mid, dest = match.groups()

    new_order = f'{mid} {dest} {host}'
    return text[:match.start()] + new_order + text[match.end():]

if __name__ == "__main__":
    text = 'permit ip host 10.22.122.161 192.168.150.16 0.0.0.7'
    print(swap_ips(text))

Выход:

permit ip 192.168.150.16 0.0.0.7 host 10.22.122.161
0
abdusco 7 Июл 2019 в 15:02

Есть ли более эффективная реализация, чтобы я мог поменять источник и назначение из всех вариантов списка ввода?

0
Behnam 11 Июл 2019 в 08:09