J'essaie de remplacer l'IP globale à l'intérieur d'un fichier par un privé et de créer un mappage d'entre eux, donc je peux le rétablir même si une partie de la nouvelle chaîne est différente. Je suis bloqué au point de remplacer l'IP globale par une fausse et de l'écrire dans un fichier.

Exemple de fichier de démarrage:

ip route 192.168.1.0 255.255.0.0 10.10.10.2
ip route 192.168.1.0 255.255.0.0 1.1.1.2
ip route 1.1.1.1 255.255.0.0 1.1.1.3
interface FastEthernet1
ip address 1.1.1.1
duplex auto
speed auto

Résultat final souhaité, certains termes peuvent changer avant de revenir en arrière:

ip route ipv4 192.168.1.0 255.255.0.0 10.10.10.2
ip route ipv4 192.168.1.0 255.255.0.0 10.1.1.11
ip route ipv4 10.1.1.10 255.255.0.0 10.1.1.12
interface FastEthernet1
ip address 10.1.1.10
duplex auto
speed auto

La cartographie que j'ai bien est un dictionnaire comme celui-ci:

mapping = {
    '1.1.1.2': "10.1.1.10", 
    '1.1.1.1': "10.1.1.10", 
    '1.1.1.3': "10.1.1.30
    }

Je suis sorti avec ce script jusqu'à présent, mais il ne fait pas ce que je veux:

import re
import ipaddress


def load_file(file) -> str:
    with open(file, 'r') as f:
        return f.read()


def find_ips(config) -> set:
    ip_regex = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
    match = set(re.findall(ip_regex, config))
    return match


def mapping_ip(ips) -> dict:
    counter = 0
    ip_table = {}
    for ip in ips:
        ip4_type = ipaddress.IPv4Address(ip)

        if ip4_type.is_global:
            counter += 1
            private = ipaddress.IPv4Address('10.1.1.10') + counter
            ip_table.update({
                ip: str(private),
                })
    return ip_table


def replace(mapping, s_file, d_file):
    with open(s_file, 'r') as reader, open(d_file, 'w') as writer:
        for line in reader:
            for orig, temp in mapping.items():
                if orig in line:
                    x = line.replace(orig, temp)
                    writer.write(x)

Une suggestion sur la façon de faire la fonction de remplacement? Seule l'IP peut être modifiée, le reste de la chaîne doit rester tel quel (revenir en arrière).

0
Max 16 mars 2019 à 13:00

2 réponses

Meilleure réponse

Vous pouvez simplement utiliser le remplacement de chaîne sur les lignes de votre fichier source:

Créer un fichier source:

t = """ip route 192.168.1.0 255.255.0.0 10.10.10.2
ip route 192.168.1.0 255.255.0.0 1.1.1.2
ip route 1.1.1.1 255.255.0.0 1.1.1.3
interface FastEthernet1
ip address 1.1.1.1
duplex auto
speed auto"""

with open("t.txt","w") as f: 
    f.write(t)

Remplacez le contenu et écrivez à "mod.txt":

mapping = {
    '1.1.1.2': "10.1.1.10", 
    '1.1.1.1': "10.1.1.10", 
    '1.1.1.3': "10.1.1.30"
    }

with open("mod.txt","w") as m, open("t.txt") as data:
    for line in data:
        for key,replacewith in mapping.items():
            line = line.replace(key,replacewith)
        m.write(line)

with open("mod.txt") as f:
    print(f.read()) 

Production:

ip route 192.168.1.0 255.255.0.0 10.10.10.2
ip route 192.168.1.0 255.255.0.0 10.1.1.10
ip route 10.1.1.10 255.255.0.0 10.1.1.30
interface FastEthernet1
ip address 10.1.1.10
duplex auto
speed auto

Cela essaiera de remplacer chaque ligne m fois (m == len (mapping)) et n'est pas très rapide en raison de la création de nombreuses chaînes intermédiaires (si quelque chose a été remplacé) - c'est plus une solution hacky à votre problème .

1
Patrick Artner 16 mars 2019 à 10:09

Vous pouvez exploiter re.sub dans ce cas, de la manière suivante:

import re
txt = 'ip route 192.168.1.0 255.255.0.0 10.10.10.2\nip route 192.168.1.0 255.255.0.0 1.1.1.2\nip route 1.1.1.1 255.255.0.0 1.1.1.3\ninterface FastEthernet1\nip address 1.1.1.1\nduplex auto\nspeed auto'
out = re.sub(r'1\.1\.1\.([1-3])','10.1.1.\g<1>0',txt)
print(out)

Production:

ip route 192.168.1.0 255.255.0.0 10.10.10.2
ip route 192.168.1.0 255.255.0.0 10.1.1.20
ip route 10.1.1.10 255.255.0.0 10.1.1.30
interface FastEthernet1
ip address 10.1.1.10
duplex auto
speed auto

Pour plus de simplicité, j'ai codé en dur txt, la ligne la plus importante est celle de re.sub:

out = re.sub(r'1\.1\.1\.([1-3])','10.1.1.\g<1>0',txt)

Il remplace les sous-chaînes de txt qui correspondent au premier argument avec le deuxième argument, le premier argument contient un groupe ([1-3]) qui est référencé plus tard dans le deuxième argument (\g<1>) donc il en fait d'exécuter le suivant déplacement:

1.1.1.1 à 10.1.1.10

1.1.1.2 à 10.1.1.20

1.1.1.3 à 10.1.1.30

Cependant, gardez à l'esprit que re.sub fonctionne en une seule passe, contrairement à l'utilisation répétée de la méthode .replace de str.

0
Daweo 16 mars 2019 à 10:53