Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden

NetOpsCoding Adventskalender 2015 Dies ist der Artikel am 21. Tag. Es tut mir leid, dass ich den Zeitplan falsch verstanden habe ...

Wenn ein Netzwerktechniker ein Skript schreibt, kann die IP-Adresse im Skript manipuliert oder berechnet werden. Wenn Sie auf die gleiche Weise wie ein normaler numerischer Wert berechnen möchten, analysieren Sie die IP-Adresse des Zeichenfolgentyps und konvertieren Sie sie in Int mit der Gewichtung für jede Ziffer. kann nicht. Darüber hinaus hat ipv6 eine große Anzahl von Ziffern und kann möglicherweise nicht durch einfaches Parsen wie die Kurzschreibweise verarbeitet werden. Daher ist es etwas mühsam, es selbst zu implementieren.

Dieses Mal werde ich das IP-Adressmodul vorstellen, das es sehr einfach macht, mit der lästigen IP-Adresse umzugehen! Offensichtlich für diejenigen, die es wissen, wusste ich diese Bequemlichkeit bis vor kurzem nicht, also werde ich sie für diejenigen teilen, die es noch nicht wissen.

1. Über das IP-Adressmodul

Das ipaddress-Modul ist ein Standardmodul, das offiziell aus Python 3.3 implementiert wurde. (PEP3144) Es basiert auf dem von Google entwickelten ipaddr-Modul. Natürlich kann fast derselbe Vorgang mit dem ipaddr-Modul ausgeführt werden, aber dieses Mal verwenden wir die IP-Adresse, die als Standardmodul installiert ist und keine Installation erfordert.

2. Umwelt

3. Funktionen im IPaddress-Modul

Das ipaddress-Modul verfügt über Funktionen für v4 / v6 wie "IPv4Address ()" und "IPv6Address ()", aber Funktionen wie "ip_address ()", die diese enthalten, sind vorbereitet und Argumente. Sie können es verwenden, ohne sich Gedanken darüber machen zu müssen, ob es sich um v4 oder v6 handelt. Das IP-Adressmodul verwendet die folgenden drei Arten von Funktionen.

Wie der Funktionsname andeutet, entspricht ip "ip_address ()", die Netzwerkadresse "ip_network ()" und die Schnittstellenadresse "ip_interface ()".

Verwenden Sie diese Funktion, um ein Objekt vom Typ ipv4 / v6 zu erstellen. Darüber hinaus können verschiedene Konvertierungen und Berechnungen mithilfe optionaler Funktionen durchgeführt werden. Die Funktionen, die bequem sind und oft persönlich verwendet werden, sind folgende.

Funktion Funktion
*.version Objekt ist v4/v6 Bestimmen Sie, über welche Informationen Sie verfügen. 4 für v4, 6 für v6
*.compressed v4 ist äquivalent,v6 gibt eine Kurzzeichenfolge zurück
*.exploded v4 ist äquivalent,v6 gibt eine Notationszeichenfolge zurück, bei der 0 nicht weggelassen wird
*.is_link_local True, wenn es sich um eine lokal reservierte Linkadresse in RFC3927 handelt
.with_with_prefixlen Präfix Gibt eine lange Adresse als Zeichenfolge zurück(10.10.10.1/24 mag)
.with_with_netmask Gibt eine Adresse im Netzwerkmaskenformat als Zeichenfolgentyp zurück(10.10.10.1 255.255.255.0 mag)

Sie können auch verschiedene Operatoren verwenden. Wenn Sie die IP-Adresse erhöhen, fügen Sie einfach die Operatoren "+", "-" zum IP-Adressmodul hinzu und beschreiben Sie den Wert. Die Höhen und Tiefen der Ziffern werden willkürlich behandelt.

Das folgende Beispiel zeigt ein Ausführungsbeispiel.

sample_ipaddress.py


#! /usr/bin/env python
# -*- coding: utf-8 -*-

import ipaddress

if __name__ == "__main__":

    ip = ipaddress.ip_address('10.2.3.4')
    nw = ipaddress.ip_network('10.0.0.0/8')

    if ip in nw: #Es ist möglich zu bestimmen, ob es in der Netzwerkadresse mit einer IP-Zeile im Netzwerk enthalten ist
        print ("%s is included %s ."%(ip, nw))
    else :
        print ("%s isn't included %s ."%(ip, nw))

    print ("="*15)

    ip = ipaddress.ip_address('10.2.3.255')
    ipv6 = ipaddress.ip_address('fd00:260:301:104::104:1')
    ex_ipv6 = ipaddress.ip_address('fd00:0260:0301:0104:0000:0000:0104:1')
    
    #ipv4/v6 Überprüfen Sie, welche Adresse gespeichert ist
    print ("%s  is IPv%d"%(ip,ip.version))
    print ("%s  is IPv%d"%(ipv6,ipv6.version))
    print ("="*15)
    #Adressinkrement
    ip = ip + 1
    ipv6 = ipv6 -2
    print ("increment ipv4 : %s"%ip)
    print ("decrement ipv6 : %s"%ipv6)
    print ("="*15)

    #Abgekürzte und nicht abgekürzte Konvertierung von ipv6
    print ("exploded ipv6 : %s"%ipv6.exploded)
    print ("compressed ipv6 : %s"%ex_ipv6.compressed)
    print ("="*15)

    #Feststellen, ob es sich um eine lokale Linkadresse handelt
    print ("%s is linklocal : %s"%(ipv6,ipv6.is_link_local))

    ipv6_ll = ipaddress.ip_address('fe80::104:1')
    print ("%s is linklocal : %s"%(ipv6_ll,ipv6_ll.is_link_local))
% python3 ipaddress_sample.py
10.2.3.4 is included 10.0.0.0/8 .
===============
10.2.3.255  is IPv4
fd00:260:301:104::104:1  is IPv6
===============
increment ipv4 : 10.2.4.0
decrement ipv6 : fd00:260:301:104::103:ffff
===============
exploded ipv6 : fd00:0260:0301:0104:0000:0000:0103:ffff
compressed ipv6 : fd00:260:301:104::104:1
===============
fd00:260:301:104::103:ffff is linklocal : False
fe80::104:1 is linklocal : True

Wie Sie oben sehen können, bestimmen die Funktionen ip_address und ip_network die Verarbeitung von ipv4 / v6. Wenn Sie dieses Modul verwenden, können Sie viel Zeit und Mühe sparen, um die Verarbeitungsfälle zwischen ipv4 und ipv6 zu trennen.

4. Zum Beispiel können Sie es zu solchen Zeiten verwenden (in Ihrem Fall)

Dieses Modul war zu solchen Zeiten für mich sehr nützlich

In einem solchen Fall. Das IP-Adressmodul spielt eine aktive Rolle in der Phase der Zuordnung von Schnittstelle und BGP, indem es die Konfiguration analysiert und Informationen extrahiert. Angenommen, Sie analysieren eine Konfiguration wie die folgende

ios-xr.conf



interface TenGigE0/0/0/0
 ipv4 address 10.10.10.10 255.255.255.0
 ipv6 nd suppress-ra
 ipv6 address fe80::222:1 link-local
 ipv6 address fd00:260:301:222::222:1/64
!

....Snip....

router bgp 64540
 neighbor 10.10.10.200
  remote-as 64601
  description "TEST-BGP-CONFIGURE"
  address-family ipv4 unicast
   route-policy as64601-sample in
   route-policy as64601-sample out
   next-hop-self
   soft-reconfiguration inbound always
  !
 !
 neighbor fd00:260:301:222::333:123
  remote-as 64601
  description "TEST-IPV6-BGP-CONFIGURE"
  address-family ipv6 unicast
   route-policy as64601-sample in
   route-policy as64601-sample out
   next-hop-self
   soft-reconfiguration inbound always
  !
 !

Dieses Mal werde ich die Methode zum Parsen dieser Konfiguration weglassen, da dies nicht der Hauptpunkt ist. Analysieren Sie zunächst die Schnittstellenkonfiguration und behalten Sie die Schnittstelleninformationen bei. Als nächstes werden die Nachbarinformationen extrahiert, und wenn die Nachbaradresse in den Schnittstelleninformationen enthalten ist, wird sie der Schnittstelle zugeordnet.

Für den Zuordnungsteil wurde derselbe Code oben als Beispiel dargestellt, jedoch Es ist möglich, nur mit dieser Beschreibung zu unterscheiden. (Da der perspektivische Teil weggelassen wird, trifft die IP direkt auf dieselbe Adresse wie die Konfiguration.)

    neighbor = ipaddress.ip_address('fd00:260:301:222::333:123') #Nachbar IP
    interface = ipaddress.ip_interface('fd00:260:301:222::222:1/64') #Schnittstellen-IP

    # interface.Vergleichen Sie nach der Konvertierung in die Netzwerkadresse mit dem Netzwerk
    if neighbor in interface.network:
        print ("%s is included %s ."%(neighbor, interface))
    else :
        print ("%s isn't included %s ."%(neighbor, interface))

Ausführungsergebnis.log


fd00:260:301:222::333:123 is included fd00:260:301:222::222:1/64 .

5. Zusammenfassung

Wenn Sie nach diesen nützlichen Modulen suchen, werden sie häufig standardmäßig installiert oder von Dritten hergestellt. Es ist in Ordnung, es mit Schwierigkeiten zu implementieren, aber tatsächlich war es möglich, es sofort mit bequemeren Funktionen zu implementieren. Oft gibt es. Es ist keine schlechte Sache, alles selbst zu implementieren, aber wenn Sie etwas finden, das für Ihren Zweck geeignet und geeignet ist, ist es viel schneller, es zu implementieren. Seien Sie nicht zu begeistert von der Implementierung und führen Sie eine gründliche "Untersuchung" durch.

Es mag offensichtlich sein, aber ich werde es hier als Selbstdisziplin schreiben (lacht)

Recommended Posts

Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Verschiedene Hinweise zur Verwendung von Python für Projekte
Ich habe versucht, Kwant zu verwenden, ein Python-Modul für die Quantentransportberechnung
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Eine Geschichte, die Seaborn einfach, bequem und beeindruckt war
Eine Geschichte, von der ich bei np.where süchtig war
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ich habe versucht, mit Python eine Pseudofraktalfigur zu zeichnen
Ich habe versucht, Python (3) anstelle eines Funktionsrechners zu verwenden
Wovon ich süchtig war, als ich Python Tornado benutzte
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Ich habe versucht, die Syntax zu bewerten, die mit der COTOHA-API zu humorvoll und humorvoll war.
Es gibt ein Muster, das das Programm bei Verwendung von Python-Threading nicht gestoppt hat
Eine Geschichte, als ich IntelliJ unter Linux verwendete und kein Japanisch eingeben konnte
Eine Geschichte, von der ich sehr überzeugt war, als ich den Code für das Monty Hall-Problem schrieb und die Gewinnrate berechnete
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, "ein Programm, das doppelte Anweisungen in Python entfernt"
Lösen Sie das japanische Problem, wenn Sie das CSV-Modul in Python verwenden.
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Beim Ausführen eines Programms mit dem Azure SDK für Python wurde "ModuleNotFoundError: Kein Modul mit dem Namen" Azure "" angezeigt
Ich habe ein Python-Skript geschrieben, das alle meine Beiträge mit der Qiita API v2 exportiert
Eine Geschichte, die es einfach macht, den Wohnbereich mit Elasticsearch und Python abzuschätzen
Als ich den AtCoder Beginner Contest ausprobierte, war es ein schreckliches Ergebnis, also schaue ich zurück
Eine Geschichte, die verschwunden ist, als ich einen Pfad angegeben habe, der mit tilda (~) in Python Open beginnt
Eine Geschichte, nach der ich süchtig war, als ich in Go nil als Funktionsargument angab
Beim Schreiben in eine CSV-Datei mit Python habe ich einen kleinen Fehler gemacht und den Liefertermin nicht eingehalten
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Ich habe versucht, das Python Package Repository (Warehouse) auszuführen, das PyPI unterstützt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe die Bewegung Python3 ausprobiert, die die Richtung im Koordinatensystem ändert
Die Geschichte, dass die Homebrew-Umgebung bei der Installation von Anaconda umgehauen wurde
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Eine Geschichte, die ich behoben habe, als ich das Lambda-Protokoll von Cloudwatch Logs erhalten habe
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
Ich habe versucht, Thonny (Python / IDE) zu verwenden.