L'essentiel à retenir — fiche imprimable (syntaxe, structures, requests, regex, Netmiko)
1. Syntaxe de base
print("Texte", variable) # affichage
nom = "R1" # variable (snake_case)
port = int("8080") # conversion str -> int
texte = f"VLAN {vlan} actif" # f-string
if n > 50: # conditions
niveau = "critique"
elif n > 10:
niveau = "suspect"
else:
niveau = "normal"
for h in ["R1", "SW1"]: # boucle for
print(h)
for i in range(1, 6): # 1..5
print(f"10.0.0.{i}")
n = 5 # boucle while
while n > 0:
print(n)
n -= 1
def carre(x): # fonction
"""Retourne le carre de x."""
return x * x
Opérateurs
| Opérateur | Rôle |
// | Division entière |
% | Modulo (reste) |
** | Puissance (2 ** 8 = 256) |
and or not | Logique (pas de &&) |
in | Appartenance |
Erreurs courantes
| Erreur | Cause |
SyntaxError | Deux-points, parenthèse, indentation |
NameError | Variable inexistante / faute de frappe |
TypeError | Mélange de types ("3" + 4) |
ValueError | int("abc"), choix invalide |
IndexError | Index hors bornes |
KeyError | Clé absente (utiliser .get) |
2. Structures de données
# LISTE : ordonnee, modifiable
ports = [22, 80, 443]
ports.append(8080)
print(ports[0], ports[-1], len(ports))
ouverts = [p for p in ports if p < 1024] # comprehension
# TUPLE : immuable (configs fixes)
r = ("192.168.1.0", 24)
# SET : valeurs uniques
ioc = {"5.6.7.8", "9.9.9.9"}
detectes = set(observes) & ioc # intersection
# DICT : paires cle-valeur (configs, JSON)
eq = {"hostname": "R1", "ip": "10.0.0.1"}
eq.get("vlan", 1) # acces sur, defaut 1
for cle, val in eq.items():
print(cle, val)
compteurs = {h: 0 for h in ["R1", "SW1"]}
À retenir : listes pour des séquences, dicts pour des objets nommés (équipements, réponses JSON), sets pour dédupliquer et croiser, tuples pour les constantes.
3. Fichiers, CSV, JSON
with open("f.txt", "w",
encoding="utf-8") as f:
f.write("R1\n")
import csv
with open("p.csv", newline="",
encoding="utf-8") as f:
for eq in csv.DictReader(f):
print(eq["hostname"])
import json
d = json.loads('{"ip": "1.1.1.1"}')
txt = json.dumps(d, indent=2)
try:
p = int(saisie)
except ValueError:
p = 22
4. Regex (module re)
import re
m = re.search(r"Gi\d+/\d+", lig)
ips = re.findall(
r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})",
logs)
m = re.search(r"SRC=(?P<ip>...)", lig)
m.group("ip")
re.sub(r"\d+\.\d+\.\d+\.\d+",
"[IP]", log)
| Motif | Sens |
\d \w \s | Chiffre, mot, espace |
+ * ? | 1+, 0+, optionnel |
(...) | Groupe capturé |
search/match | Partout / début |
5. API REST avec requests
import requests
h = {"Authorization": "Token X"}
r = requests.get(url, headers=h,
timeout=10)
r.raise_for_status()
for eq in r.json()["results"]:
print(eq["hostname"])
r = requests.post(url, json=payload,
headers=h, timeout=10)
# 200 OK | 201 Created | 401 | 404 | 500
Règles : toujours un timeout, toujours raise_for_status(), token en variable d'environnement.
6. Netmiko et SOC
from netmiko import ConnectHandler
dev = {"device_type": "cisco_ios",
"host": "10.0.0.1",
"username": "admin",
"password": "..."}
with ConnectHandler(**dev) as ssh:
print(ssh.send_command(
"show ip interface brief"))
ssh.send_config_set(["vlan 30",
"name INVITES"])
ssh.save_config()
from collections import Counter
top = Counter(sources).most_common(5)
alertes = set(sources) & ioc
Lab uniquement : testez en environnement isolé, sauvegardez avant tout changement, journalisez avec logging.