Python Networking
Python Networking
Sous Linux
python2 -m pip install Package # default Python 2
python2.7 -m pip install Package # specifically Python 2.7
python3 -m pip install Package # default Python 3
python3.4 -m pip install Package # specifically Python 3.4
python3 -m pip install -U Package
sous Windows
py -2 -m pip install Package # default Python 2
py -2.7 -m pip install Package # specifically Python 2.7
py -3 -m pip install Package # default Python 3
py -3.4 -m pip install Package # specifically Python 3.4
python -m pip install -U Package
Remarque:
Pour certains packages scientifiques, consulter:
https://packaging.python.org/en/latest/science/
Présentation de python
Python est un langage interprété. Chaque ligne lue est exécutée sans avoir besoin d’un compilateur. Il est un langage
modulaire. L’un des 3 premiers langages de programmation. Utilisé dans divers domaines tels que :
- La météo, la cartographie
- Les réseaux informatique/ télécoms {Admiration, sécurité, audit, hacking}
- administration des bases de données {Oracle, MySQl, PostgreSQL, MongoDB, SQL Server, Cassandra, …}
- Analyse et visualisation de donnees, Machine learning, ….
Téléchargement : www.python.org/downloads
docs.python.org
Les IDE python :
- IDLE
- Pycharm
- wing IDE Personal
- Sublime text3
- Atom
- Vs code
- Vim / neovim
Installation de python sous Linux : sudo apt-get install python3
Installation de pip : sudo apt-get install python3-pip
Importation du module
from unModule import uneFonction[, uneAutreFonction,…] Importer une ou plusieurs fonctions
from unModule import * Importer toutes les fonctions
Import module Importer le module en entier
from unModule import uneFonction as fc Alias d’une fonction importée
Sous linux il faut préciser le chemin ou se trouve python, même chose que le bash
# !/usr/bin/en python
Formatage :
age=25
nom='Ousmane'
prenom='Hadi'
print('{} {} a {} ans '.format(nom,prenom,age))
print(nom, prenom, 'a' , age, 'ans')
print(f'{nom} {prenom} a{age} ans')
Long text
exemple :
print("je suis nigerien , je suis etudiant \
a l'Ecole Superieure des Telecommunication ")
Erreur Correction
print(‘c:\niger\niamey’) print(‘c:\\niger\\niamey’)
print(‘je m’en vais’) print(‘je m\’en vais’)
Concaténation
nom="Moussa"
prenom="Dan Ladi"
print(nom+" "+prenom)
recherche d’une chaine de caractères
presention="EST, Ecole Superieure des Telecommunications, situee a Niamey face ENAM"
presentation.find('EST')
Liste : ensemble d’éléments séparés par des virgules, compris entre crochets
linux=['debian','ubuntu','redhat','centos']
print("premiere distrition est", linux[0])
print("deuxieme distrition est", linux[1])
Modifier le contenu d’une variable
linux[0]="Slax"
print("premiere distrition est",linux[0])
Format de liste : tableau [0-Nn-1]
print(linux[2 :]) #affiche les éléments de la liste à partir du 3e jusqu’au denier
print(linux[2 :]*2) #afficher le résultat 2 fois
mot[-1] mot[ :-1] mot[ -4:-1] mot[2 :] mot[0 :3] mot[0]+ mot[-1] mot[0]*5
Produit=['mil','mais','sorgho','riz','patate','manioc']
print(Produit[-1])
print(Produit[ :])
print(Produit[ :-1])
print(Produit[2 :4])
prix=[450,375,300,22550,125,200]
Quantite=[5,5,2,3,14,6]
print('le montant total de',produit[0],prix[0]*quantite[5])
tout=[[produit],[prix]]
print(tout[0],tout[1])
Exercice 1
Soit la liste : nbre = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Avant de le vérifier a l’aide de python, donner le résultat mentalement
nbre [3:6] nbre [7:10] nbre [3:0] nbre[3:6:3]
nbre [0:1] nbre [-3:-1] nbre [:] nbre[::4]
nbre [-3:0] nbre [-3:0] nbre[0:10:1]*2 [8:3:-1]
[0:10:-2] [::-2] [5::-2] [1:5:-2]
Formatage du texte
nom= input("Quel est votre nom? ")
veux = input("Quel est votre meilleur voeux pour le Niger? ")
print("{} souhaite {} pour le Niger").format(nom,veux)
Ordre d’affichage des variables (avec 0 pour la variable à afficher en premier, 1 pour la variable à afficher en
second,..
nom= input("Quel est votre nom? ")
veux = input("Quel est votre meilleur voeux pour le Niger? ")
print("{0} souhaite {1} pour le Niger").format(nom,veux)
Structure de données
list.clear() list.append(x) list.insert(i, x) list.remove(x) list.clear() list.pop([i]) list.index(x[, start[, end]])
list.count(x) list.sort(key=None, reverse=False) list.reverse()
list.popleft() del list[n]
list(‘Afrique’)
Ajout d’un élément en tête de liste
L=[]
produit.append('oignon')
produit.append(0,'Riz')
print(produit)
Ajouter un élément à la position k de la liste
produit.insert(1,'tomate')
Supprimer un élément de la liste
produit.remove('riz’)
Renverser l’ordre du contenu de la liste : le premier élément devient le dernier
produit.reverse()
Supprimer le dernier élément de la liste
produit.pop()
Supprimer un élément de la liste à la position k
del produit[1]
print(produit)
Concaténer les contenus de deux listes
produit1=['mil','mais','sorgho']
produit2=['riz','patate','manioc']
produit=produit1+produit2
toutProduit=[produit1,produit2]
print(toutProduit[][])
print(toutProduit[1][1])
Exemple 1:créer une liste a partir d’une boucle
carre = []
for x in range(10):
carre.append(x**2)
Exemple 2:
carre = [x**2 for x in range(10)]
Exemple 3 :
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
Exercice
Soit d = [-4, -2, 0, 2, 4]
1. Créer une liste avec des valeurs doubles de d
2. Exclure des valeurs négatives dans d
3. Utiliser une fonction aux valeurs de d
4. Donner une liste qui contient le tuple carre des valeurs de d
Exercice :
Soit la matrice
A= [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ]
1. Donner la transposée de A
Solution 1:
H=[
[row[i] for row in A]
for i in range(4)]
print(H)
Solution 2
A=[]
for i in range(4):
A.append([row[i] for row in A])
Déterminer la valeur maximale
print(max(prix)) #affiche le prix maximal
print(min(prix)) #affiche le prix minimal
Le nombre d’éléments de la liste
print(len(prix))
Exercice 1
Soit rep= ‘decolonisation’
1 col=list(rep) 6 d[0],d[2],d[4], d[5],d[6] =’d’,’ m’,’c’,’r’, ’t’
2 del col[0 :2] 7 print(d)
3 re=list(‘re’) 8 d.insert(6,’a’)
4 rec=re+col 9 print(d)
print(rec)
5 d=rec 10 d[9 :]=’e’
Exercice 2
Soit d=’democratisation’
1 dl=list(d) 9 k.index(‘e’)
2 dl.count(‘i’) 10 k.pop()
3 dl.count(‘i’) 11 k.pop(0)
4 s=d[ :4] 12 k.remove(‘m’)
5 t=d+s 13 m=k
6 t.count(‘d’) 14 m.sort()
7 l=list(‘anti’) 15 y=sorted(k)
8 k.extend(d)
Ensemble. Set()
s0={1,7,7,2}
s1={1,2,10,20}
print(len(s0))
s0.add(5)
print(s1.discard(s0))
print(not s0.isdisjoint(s1))
print(s0.intersection(s1))
print(s0.difference(s1))
print(s0.union(s1))
print(s0.issubset(s1))
Exercice : donner le role de chaque met
Produit=(‘Tomate’,’Riz’,’Arome’)
Dictionnaire : c’est comme un tableau
Pourquoi le dictionnaie ?
Soit eleve=[‘Ali’,’Iro’,’Ami’,’Hadi’]
telephone=[20586313,20659874,21561202,20265981]
Chercher le numéro de Ami : telephone[eleve.index(‘Ami’)]
Sous forme de dictionnaire :
eleve=[‘Ali’ : 20586313,’Iro’: 20659874,’Ami’: 21561202,’Hadi’: 20265981]
fourniture={'cahier':'200','crayon':'couteur','gomme' :'100','livre' :'Afrique mon
Afrique'}
etudiant={'nom':'ali','prenom':'sani','adresse' :'Lamorde','genre' :'H'}
print(fourniture)
print(fourniture['cahier'])
del (fourniture['gomme'])
Exercice
v=[
{'cmd':1,'jr':'2022-04-15','tel':20659874,
'achat':[
{'art':'bic','qte':5,'px':75},
{'art':'regle','qte':2,'px':50},
{'art':'Ardoise','qte':3,'px':250}
]
},
{'cmd':2,'jr':'2022-04-15','tel':93659874,
'achat':[
{'art':'gomme','qte':2,'px':25},
{'art':'crayon','qte':5,'px':50},
{'art':'Ardoise','qte':3,'px':250}
]
},
{'cmd':3,'jr':'2022-04-17','tel':87659874,
'achat':[
{'art':'bic','qte':14,'px':75},
{'art':'regle','qte':7,'px':50},
{'art':'Ardoise','qte':3,'px':250},
{'art':'Classeur','qte':3,'px':1250}
]
}
]
1. Donner le nombre de commandes
2. Donner le nombre de commandes par jour
3. Donner le nombre de commandes par mois
4. Donner le nombre de commandes par an
5. Donner le le montant total de chquae commande
6. Donner le chiffre d’affaires par jour
7. Donner le jour ou il ya plus de chiffre d’affaires
electeur={'id':22,'Nom':'Ali','age':25,'nationalite':'nigerienne'}
print(electeur,"\n",electeur1)
if (electeur.get('nationalite')=='nigerienne' and (electeur.get('age')>=18)):
print("vous pouvez voter")
else:
print("Vous ne pouvez pas voter. DESOLE")
eleve=['Ali','Sani','Iro','Hadi']
donnee=input('Nom')
if donnee:
print('ok')
else:
print('non’)
while True:
print('*'*50)
print('*'*15,'Presention du membre de UIN','*'*15)
print('1: Presentez-vous\n2:Vos propositions ')
ch=input('Faire un choix: ')
if ch == '1':
nom=input("Nom: ")
prenom=input("Prenom: ")
niveau=input("Niveau: ")
genre=input("Genre: ")
age=input("Age: ")
elif ch == '2':
message=input("Saisir le message: ")
if message:
print("Merci pour votre production")
Pour les nombres complexes, importer le module cmath
Reoudre (1+3j) * (9+4j)
Resoudre (1+3j) / (9+4j)
WHILE
i=0 On peut également utiliser un else pour faire les
while(i<8): instructions qui ne remplissent pas les conditions du while.
print(‘tour numero’,i) i=9
i+=1 while(i<8):
print('tour',i)
i+=1
else:
print('hors condition!')
FOR
for i in [1,2,3]: condiment=['Huile','Tomate','Oignon','S
print(i) el']
for c in condiment:
print(c)
break ou continue for n in range(2,25,3):
i=1 print(n)
while(i<8):
print('tour',i) = ['Ali', 'Adi', 'Kaka', 'Sani',
i+=1 'Labo']
if(i==5): for i in range(len(a)):
break print(i, a[i])
else:
print('hors sujet!')
ecole=[['UAM','UM','UZ','UT'],
['EST','EPN', 'EMIG']]
for u in range(0,1) :
for e in range(0,1) :
print (ecole[u][e]):
Le fichier
Script python Contenu du fichier f.txt
Exercice d’application 2
Exercice d’application 3 : Objectif : écrire un programme qui copie certaines données d’un fichier vers un autre
Les fonctions
Syntaxe
Exemple :
def menu():
l=50
lg=10
lg_item=l - lg
entete = '%-*s%*s'
frm= '%-*s%*.2f'
print('*'*l)
print(entete %(lg_item,'TABLEAU DE BORD',lg,''))
print('*'*l)
print(entete %(lg_item,'Menu',lg,'Choix'))
print('*'*l)
print(entete %(lg_item,'Afficher',lg,1))
print(entete %(lg_item,'Rechercher',lg,2))
print(entete %(lg_item,'Ecrire',lg,3))
print(entete %(lg_item,'Charger les donnees d\'un fichier',lg,4))
print(entete %(lg_item,'Exporter les donnees dans un fichier',lg,5))
print(entete %(lg_item,'Statistiques',lg,6))
print(entete %(lg_item,'Quitter',lg,7))
print(entete %(lg_item,'Quitter',lg,8))
menu()
Exemple : Ecriture d’une fonction qui inscrire les etudiants dans un fichier
def inscrire(n,p,d,f,dp,v):
with open('C:\\db\\inscrire.txt','a') as fic:
fic.write(f'{n} {p} {d} {f} {dp} {v} \n ')
inscrire('Ali', 'Kaka', 'Licence', 'FST', 'Informatique', 'Bac')
Exercice : Gestion de versement/retrait d’argent d’un compte bancaire
from datetime import datetime as D
jr=D.now().date()
while True:
print('*'*50)
print('*'*10, "Tableau de bord",'*'*10)
ch=input('1:Crediter\n2:Debiter\n3:Rechercher\n4:Quitter')
if ch=='1':
c=input('Entrer le numero de compter a crediter: ')
if c.isdigit():
m=input('Entrer le montant: ')
if m.isdigit():
with open("bank.txt","a") as f:
f.write("{};{};{};{}".format(jr,c,m,0))
if ch=='2':
c=input('Entrer le numero de compter a crediter: ')
if c.isdigit():
m=input('Entrer le montant: ')
if m.isdigit():
with open("bank.txt","a") as f:
f.write("{};{};{};{}".format(jr,c,m,1))
if ch == '3':
r=input('Entrer le numero a rechercher: ')
if r.isdigit():
with open("bank.txt") as f:
for ligne in f:
l=ligne.split(";")
if l[1] == r:
print(l[1], 'existe')
convertCSVJson('recrute.csv','recrute.py')
Exercices d’application
Soit une base de données contenant les ventes
d=[
{'cmd':5,'cl':'Abdou','prd':[{'p':'Bic','px':100,'qte':2},{'p':'Gomme','px':50,'qte':3}]},
{'cmd':6,'cl':'Ari','prd':[{'p':'eponge','px':200,'qte':8},{'p':'marqueur','px':800,'qte':
6},{'p':'Gomme','px':50,'qte':3}]},
{'cmd':8,'cl':'Abou','prd':[{'p':'Regle','px':100,'qte':2},{'p':'compas','px':50,'qte':3}]
},
]
1. Ecrire une fonction qui retourne le nombre de commandes
def compter(i=0):
for x in d:
i+=1
return i
print(compter())
2. Ecrire une fonction qui retourne le nombre de produits achetés pour chaque commande
def compterCmd():
L=[]
for x in d:
i=0
for y in x['prd']:
i+=1
L.append([x['cmd'],i])
return L
print(compterCmd())
def compterCmd(c,i=0):
for x in d:
if x['cmd'] ==c:
for y in x['prd']:
i+=1
return c,i
for x in d:
print(compterCmd(x['cmd']))
desactiver(){
cat /etc/passwd | cut -d ':' -f 1 | grep $d | while read line
do
echo $line
done
}
desactiver ben
Programme SHELL qui désactive les comptes des utilisateurs se trouvant dans un fichier
#!/bin/bash
c="$(cut -d : -f 1 /etc/passwd)"
while read l; do
for i in $c;do
if [ $i = $l ]; then
if [ $? -eq 0 ]; then
passwd -l $i
echo "$i est desactive"> /tmp/cmp.txt
else
echo "$i n'est pas desactive" >> /tmp/cmp.txt
fi
fi
done
done < utilisateur.txt
Programme qui créer les comptes des utilisateurs :
#!/bin/bash
while read ligne; do
useradd $ligne
done < utilisateur.txt
Programme SHELL qui permet d’expirer les comptes des utilisateurs au 31 décembre 2018
#!/bin/bash
while read ligne; do
#chage -E 2018-12-31 $ligne
echo "========$ligne========="
chage -l $ligne
done < utilisateur.txt
Programme qui recherche un dans un fichier :
#/bin/bash
echo 'Entrer le fichier'
read fich
echo 'Entre le mot recherche'
read mot
cat $fich | while read line
do
done
}
Programmation module avec SHELL
#!/bin/bash
source exoPing.sh
for address in 10.0.0 172.16.128
do
pinger $address
done
Création des comptes utilisateurs en utilisant la commande newusers
a. Creation du fichier qui contient les comptes a créer
kaka :kaka2018 :1050 :1050 :kakale:/home/kaka/ :/bin/bash
nana: nanachoi :1051 :1051 : nana:/home/nana/ :/bin/sh
b. Creation du programmme:
#!/bin/bash
echo 'Entrer le fichier contenant les comptes a creer'
read fich
if [ -f $fich ]
then
newusers $fich
fi
Ecriture dans un fichier avec Python
#!/usr/bin/python
ecriture=raw_input('Saisir un text')
f=open('./b.txt','a')
while ecriture !='':
f.write(ecriture)
f=open('./b.txt','r')
for k in f:
print(k+'\n')
Exemple : ecriture dans un fichier
Exercices d’application
1. Ecrire un script python qui pingue une liste des machines saisie dans un fichier
2. Ecrire un script python qui permet de changer les droits du contenu du dossier d’un utilisateur de votre choix
3. Ecrire un script python qui pingue les 10 premières machines de chacun des réseaux : 10.16.0.0/12,
10.32.0.0/12 et 10.48.0.0/12
4. Ecrire un script python qui copie uniquement les fichiers du dossier /etc et les place dans un dossier de votre
choix
5. Ecrire un script python qui créer des utilisateurs saisis dans un fichier
6. A la fin du stage, le directeur des ressources humaines vous demande de supprimer une liste des stagiaires
contenus dans un fichier.
7. Ecrire un script python qui fixe la date d’expiration des mots de passe des utilisateurs saisis dans un fichier
texte
Proposition de solution:
Exercice 1 Exercice 2
import os as o Ecrire un script Pytho qui permet
f=open('machine.txt') compter le nombre de fichiers et sous
for f in f: dossiers contenus dans un dossier
o.system('ping'+' '+f)
os.startfile() Démarrer un programme
Exemple: o.startfile('notepad.exe')
Subprocess
Ouvrir le fichier rh.txt dans notepad subprocess.call(['notepad.exe','C:\\app\\ rh.txt '])
Ouvrir notepad subprocess.Popen(['notepad.exe'])
Urllib2
import urllib2 as u
r=u.urlopen('https://www.google.com')
print(r.info())
html=r.read()
r.close()
Scapy
sudo scapy
pk=IP(dst=’www.google.fr’)
pk.show
p[0]
P=sniff(iface=’eth1’,count=3) Sniffer 3 pauets sur l’interface eth1
p.summary()
P[0].show()
P[0].[IP].show() Avoir des infos précises sur la couche IP
pour sniffer les packets en temps reel, il faut user la fonction lambda:
packet=sniff(filter="icmp", iface='eth1', count=3, prn=lambda x:x.summary())
scapy sera plus détaillé dans l’activité 5
Fernet utilise l’algorithme symétrique. Ainsi, le message crypté ne peut être lu sans la clef
Objectif: testez les failles de vos propres équipements dans le but de vous protéger.
L’enseignant n’est pas responsable de tout acte indésirable posé par l’apprenant
Client Python
metasploit
3) à partir d’un fichier
4) Nmap
Installer le module nmap de Python : pip install nmap
7) Script Python qui retourne la version de service exécutée sur les ports et ce, sur chaque machine
8) Connexion SSH avec le module pexpect
Ssh compte@machine
9) Exercice : écrire un script qui teste les mots de passe contenus dans un fichier pour se connecter au
serveur distant
10) Exercice : écrire un script qui teste les mots de passe contenus dans un fichier pour se connecter aux
serveurs distants
11) Autre méthodes
12) Configuration d’un routeur avec le module telnetlib
192.168.56.0/24
.1 .5
tn.write(b"enable\n")
tn.write(p.encode('ascii') + b"\n")
tn.write(b"conf t\n")
tn.write(b"hostname DELEGUE\n")
tn.write(b"end\n")
tn.write(b"exit\n")
print(tn.read_all().decode('ascii'))
Fichier niv1.txt
Fichier niv1.txt Fichier niv2.txt
d. Scapy
psutil
Les liens utiles
Hacking
https://packetstormsecurity.com
http://www.securityfocus.com
www.securitytube.net
https://www.xmco.fr
www.zataz.com
https://www.owasp.org
https://www.hackerzvoice.net
Exercice :
1. Ecrire un script python qui permet de crypter tous les fichiers contenus dans un dossier
2. Ecrire un script python qui permet de crypter tous les fichiers appartenant à un utilisateur
3. Ecrire un script python qui permet de crypter tous les fichiers appartenant à plusieurs utilisateurs
TCP UDP
import socket as s import socket as s
s.setdefaulttimeout(5) s.setdefaulttimeout(5)
n=s.socket(s.AF_INET,s.SOCK_STREAM) n=s.socket(s.AF_INET,s.SOCK_DGRAM)
POST,PORT=’172.16.128.2’,80 POST,PORT=’172.16.128.2’,80
n.connect((POST,PORT)) n.sendto(‘Bonjour’, (POST,PORT))
n.send(‘Bonjour’) rep=n.recvfrom(1024)
rep=n.recv(1024) print(rep)
print(rep)
Exercice
Ecrire un programme Python qui redémarre un programme s’il est arrêté.
Exercice d’application
Exercice
Ecrire un programme python qui retourne des informations sur les partitions de disque, les mémoires, les
processus et ce, sur toutes machines appartenant aux réseaux 10.16.0.0/12, 10.32.0.0/12, 10.48.0.0/12
Utilisation de python dans l’audit du réseau
Premier cas : pour une seule machine distance
Exercice 1
a. Ecrire un programme SHELL qui crée les utilisations se trouvant dans un fichier tout en fixant
la date d’expiration de leurs comptes au 31 décembre 2019.
b. Configurer le nombre maximum de 40 jours pendant lesquels un mot de passe est valable.
Ainsi l’'utilisateur est obligé de changer son mot de passe avant de pouvoir utiliser son compte.
Configurer le nombre de 5 jours d'avertissement avant que le changement de mot de passe ne soit
obligatoire.
c. Vérifier si ce changement est prise en compte pas le système
Exercice 2
Commande : lastb
Ecrire un programme SHELL qui liste les utilisateurs dont les tentatives d’authentification d’accès ont
échoué.
Exercice 3 :
La commande newusers lit un fichier (ou l’entrée standard par défaut) et utilise ces informations
pour mettre à jour un ensemble d’utilisateurs existants ou pour créer de nouveaux utilisateurs. Chaque
ligne a le même format que le fichier de mot de passe standard (voir passwd (5)).
a. Créer d’abord un fichier nommé utilisateur.txt qui contient les utilisateurs à créer :
Partant de l’exemple ci-dessus, écrire un script SHELL qui automatique la création des utilisateurs le janvier
2019. A cet effet, un fichier sera créé et indiquera si un utilisateur n’a pas été crée
Partie 2
Prérequis:
Exercice 1
Exemple 1: avec le module ssh2-python, connecter à la VM et créer un fichier classe.txt dans le dossier ecole
Exercice 2
Exercice 3
Ecrire un programme SHELL qui vide les corbeilles de tous les utilisateurs et ce, chaque dimanche à 22h15
Exercice 4
- protège le dossiers /var/log et ses fichiers contre tout accès par les simples utilisateurs :
Exercice 5
Exercice 6
Partie A
Partie 7
Reprendre les questions de la partie A sur les machines de la topologie ci-dessous. Utiliser le module
telnetlib ou ssh2-python
Avec le module ssh2-python, écrire un script qui vide les corbeilles de tous les utilisateurs, et ce, chaque
dimanche à 22h15 sur chaque machine virtuelle.
Exercice 8
Logiciels : GNS3
Travail préliminaire :
Fichiers de configuration
Switch ESW2
Exercice 9
a. Ecrire un programme python (avec le module ssh2-python) qui liste les utilisateurs dont les
tentatives d’authentification d’accès ont échoué sur les serveurs
b. Ecrire un programme python (avec le module ssh2-python) qui installe le SGBD PostgreSQL
sur tous les serveurs.
c. Ecrire un programme python (avec le module ssh2-python) qui donne l’espace disque restant
sur chaque partition de chaque serveur.
d. Ecrire un programme python (avec le module ssh2-python) qui nettoie les fichiers inutiles sur
chaque serveur
Exercice 10
a. Créer une base de données BANQUE
Create database BANQUE ;
b. Créer une table COMPTE
Create table COMPTE(id INT PRIMARY KEY AUTO_INCREMENT, numCompte INT(25) NOT NULL
UNIQUE, nom VARCHAR(50) NOT NULL, prenom VARCHAR(50) NOT NULL, adresse TEXT, telephone
INT(8)) ;
c. Créer la table MOUVEMENT
Create table MOUVEMENT(id INT PRIMARY KEY AUTO_INCREMENT, montant INT(15) NOT NULL,
type INT(1) ENUM(0,1),idCompte INT NOT NULL);
d. Création de la clef étrangère dans la table MOUVEMENT
ALTER TABLE MOUVEMENT ADD CONSTRAINT fki_dCompte FOREIGN KEY(idCompte) REFERENCES
COMPTE(idCompte)
e. Charger les données dans les tables COMPTE et MOUVEMENT
Exercice 11
Ecrire un programme python qui copie les fichiers/dossiers des utilisateurs se trouvant dans un fichier
‘utilisateurs.txt’ sur le serveur de fichiers et ce, chaque samedi à partir de 23h :59
Exercice 8
ˉ implémente les règles de sécurité du firewall(avec la commande iptables) sur les serveurs :
ˉ liste les règles de sécurité définies
ˉ donne les statistiques sur le trafic du réseau 172.16.116.0/20
Exercice 4
a. module mechanize
br=mechanize.Browser() → creation d’une instance browser
ouvrir=br.open(url)
----------------------Objets du formulaire--------------------------------------------------------------------------------------------
print form
----------------------------------------------------------------------------------------------------------------------------------------------
b. Le module urllib
c. Le module BeautifulSoup
Passez a la verification
a. Vérifier si le switch client VTP a reçu des vlan
b. Vérifier si les machines clients ont reçu des adresses IP via le service DHCP
c. Faire le ping des machines appartenant aux VLANs différents
d. Pour chaque machines cliente, vérifier sa passerelle par défaut
e. Arrêter un des routeurs et vérifiez si les machines reçoivent des adresses IP
Nb : telnetlib est un module standard de python donc ne nécessite pas d’être installé encore
Travail demandé :
Partant de l’exemple manuel de configuration de la topologie ci-dessus, écrire un programme python (avec
telnetlib) pour configurer les routeurs et switch de cette topologie.
(module : ssh2-python)
Exercice
Utiliser le module ssh2-python pour auditer les serveurs et stocker le contenu dans un fichier.
Module zlib
Niveau
1 Plus rapide mais la compression n’est pas efficace
9 Très bonne compression mais lent
Exemple 1 : lire le contenu d’un fichier compresser
Exercice 1
Travail demandé :
ˉ Configuration
Configuration du protocole OSPF sur le routeur Tchad
>enable
#conf t
(config)#int s3/0
(config-if)#ip address 12.0.0.2 255.0.0.0
(config-if)#no shutdown
(config-if)#exit
(config)#router ospf 1
(config-router)#network 12.0.0.0 0.255.255.255 area 0
(config-router)#redistribute connected
(config-router)#end
#copy r s
Configuration des sous-interfaces, OSPF, RIP sur le routeur Niger
>enable
#conf t
(config)#int f0/1
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/1.1
(config-subif)#encapsul dot 2
(config-subif)#ip add 10.16.16.1 255.255.240.0
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#encapsul dot 5
(config-subif)#ip add 172.16.32.1 255.255.240.0
(config-subif)#exit
(config)#int f0/0
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/0.1
(config-subif)#encapsul dot 3
(config-subif)#ip add 10.16.32.1 255.255.240.0
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#encapsul dot 4
(config-subif)#ip add 172.16.16.1 255.255.240.0
(config-subif)#exit
(config)#router ospf 1
(config-router)#network 12.0.0.0 0.255.255.255 area 0
(config-router)#redistribute connected
(config-router)#redistribute rip
(config-router)#exit
(config)#router rip
(config-router)#network 11.0.0.0
(config-router)#redistribute connected
(config-router)#redistribute ospf 1
config-router)#do copy r s
Configuration des sous-interfaces, EIGRP, RIP sur le routeur Nigeria
>enable
#conf t
(config)#int f0/0
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/0.1
(config-subif)#encapsul dot 2
(config-subif)#ip add 10.16.16.2 255.255.240.0
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#encapsul dot 5
(config-subif)#ip add 172.16.32.2 255.255.240.0
(config-subif)#exit
(config)#int f0/1
(config-if)#no ip address
(config-if)#no shutdown
(config-if)#exit
(config)#int f0/1.1
(config-subif)#encapsul dot 3
(config-subif)#ip add 10.16.32.2 255.255.240.0
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#encapsul dot 4
(config-subif)#ip add 172.16.16.2 255.255.240.0
(config-subif)#exit
(config)#router eigrp 1
(config-router)#network 13.0.0.0 0.255.255.255
(config-router)#redistribute connected
(config-router)#redistribute rip
(config-router)#exit
(config)#router rip
(config-router)#network 11.0.0.0
(config-router)#redistribute connected
(config-router)#redistribute eigrp 1
(config-router)#exit
(config)#int s3/0
(config-if)#ip add 13.0.0.1 255.0.0.0
(config-if)#no sh
(config-if)#end
#copy r s
Configuration du protocole EIGRP sur le routeur R2
>enable
#conf t
(config)#int s3/0
(config-if)#ip add 13.0.0.2 255.0.0.0
(config-if)#no sh
(config-if)#exit
(config)#router eigrp 1
(config-router)#network 13.0.0.0 0.255.255.255
(config-router)#redistribute connected
(config-router)#do cop r s
Configuration des VLAN, VTP sur le switch ESW1
>en
#vlan database
(vlan)#vlan 2 name IT
(vlan)#vlan 3 name RH
(vlan)#vlan 4 name MARKETING
(vlan)#vlan 5 name COMPTA
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#channel-group 1 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#channel-group 2 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode access
(config-range-if)#no sh
(config-range-if)#exit
(config)#int f0/0
(config-if)#switchport access vlan 3
(config-if)#exit
(config)#int f0/1
(config-if)#switchport access vlan 4
(config-if)#do copy r s
ESW2
>en
#vlan database
(vlan)#vtp client
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#channel-group 1 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#channel-group 2 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode access
(config-range-if)#no sh
(config-range-if)#exit
(config)#int f0/0
(config-if)#switchport access vlan 5
(config-if)#exit
(config)#int f0/1
(config-if)#switchport access vlan 2
(config-if)#end
#copy r s
#show vlan-switch
ESW3
>en
#vlan database
(vlan)#vtp client
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#channel-group 1 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#channel-group 2 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode trunk
(config-range-if)#no shutdown
(config-range-if)#end
#copy r s
#show vlan-switch
ESW4
>en
#vlan database
(vlan)#vtp client
(vlan)#vtp domain ETUDES
(vlan)#vtp password etudes@ne
(vlan)#apply
(vlan)#exit
#show vlan-switch
#config t
(config)#int range f0/2 - 4
(config-range-if)#no sh
(config-range-if)#channel-group 1 mode on
(config-range-if)#exit
(config)#int po1
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/5 - 7
(config-range-if)#no sh
(config-range-if)#channel-group 2 mode on
(config-range-if)#exit
(config)#int po2
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#int range f0/8 - 10
(config-range-if)#channel-group 3 mode on
(config-range-if)#no sh
(config-range-if)#exit
(config)#int po3
(config-if)#switchport mode trunk
(config-if)#switchport trunk allowed vlan add 2-5
(config-if)#no sh
(config-if)#exit
(config)#
(config)#int range f0/0 - 1
(config-range-if)#switchport mode trunk
(config-range-if)#no shutdown
(config-range-if)#end
#copy r s
#show vlan-switch
Configuration du protocole GLBP sur le routeur Niger
(config)#int f0/1.1
(config-subif)#glbp 1 preempt
(config-subif)#glbp 1 priority 200
(config-subif)#glbp 1 ip 10.16.16.5
(config-subif)#glbp 1 load ro
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#glbp 2 preempt
(config-subif)#glbp 2 priority 200
(config-subif)#glbp 2 ip 172.16.32.5
(config-subif)#glbp 2 load ro
(config-subif)#exit
(config)#int f0/0.1
(config-subif)#glbp 3 preempt
(config-subif)#glbp 3 priority 200
(config-subif)#glbp 3 ip 10.16.32.5
(config-subif)#glbp 3 load ro
(config-subif)#exit
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#glbp 4 preempt
(config-subif)#glbp 4 priority 200
(config-subif)#glbp 4 ip 172.16.16.5
(config-subif)#glbp 4 load ro
(config-subif)#exit
(config-subif)#end
#copy r s
Configuration du protocole GLBP sur le routeur Nigeria
(config)#int f0/0.1
(config-subif)#glbp 1 preempt
(config-subif)#glbp 1 priority 200
(config-subif)#glbp 1 ip 10.16.16.6
(config-subif)#glbp 1 load ro
(config-subif)#exit
(config)#int f0/0.2
(config-subif)#glbp 2 preempt
(config-subif)#glbp 2 priority 200
(config-subif)#glbp 2 ip 172.16.32.6
(config-subif)#glbp 2 load ro
(config-subif)#exit
(config)#int f0/1.1
(config-subif)#glbp 3 preempt
(config-subif)#glbp 3 priority 200
(config-subif)#glbp 3 ip 10.16.32.6
(config-subif)#glbp 3 load ro
(config-subif)#exit
(config-subif)#exit
(config)#int f0/1.2
(config-subif)#glbp 4 preempt
(config-subif)#glbp 4 priority 200
(config-subif)#glbp 4 ip 172.16.16.6
(config-subif)#glbp 4 load ro
(config-subif)#exit
(config-subif)#end
#copy r s
Configuration du DHCP sur le routeur Niger
#conf t
(config)#ip dhcp pool pool101616
(dchp-config)#network 10.16.16.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 10.16.16.5
(dchp-config)#exit
(config)#ip dhcp pool pool1721632
(dchp-config)#network 172.16.32.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 172.16.32.5
(dchp-config)#exit
(dchp-config)#exit
(config)#ip dhcp pool pool101632
(dchp-config)#network 10.16.32.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 10.16.32.5
(dchp-config)#exit
(dchp-config)#exit
(config)#ip dhcp pool pool1721616
(dchp-config)#network 172.16.16.0 255.255.240
(dchp-config)#lease 2
(dchp-config)#default-router 172.16.16.5
(dchp-config)#exit
(config)#ip dhcp excluded-addr 10.16.16.1 10.16.16.10
(config)#ip dhcp excluded-addr 10.16.32.1 10.16.32.10
(config)#ip dhcp excluded-addr 172.16.32.1 172.16.32.10
(config)#ip dhcp excluded-addr 172.16.16.1 172.16.16.10
Configuration du SSH sur le routeur Niger
(config)#line vty 0 4
(config-line)#password etudiant@NE
(config-line)#login local
(config-line)#transport input ssh
(config-line)#exit
(config)#ip domain-name 8.8.8.8
(config)#username etudes passw etude@NE
(config)#enable password etude@NE
(config)#service password-encryption
Configuration du protocole HSRP sur ESW3
(config)#int vlan 2
(config-if)#ip add 10.16.16.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 ip 10.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 3
(config-if)#ip add 172.16.32.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 ip 172.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 4
(config-if)#ip add 10.16.32.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 ip 10.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config-if)#exit
(config)#int vlan 5
(config-if)#ip add 172.16.16.4 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 172.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#end
#cop r s
Configuration du protocole HSRP sur ESW4
(config)#int vlan 2
(config-if)#ip add 10.16.16.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 150
(config-if)#standby 1 ip 10.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 3
(config-if)#ip add 172.16.32.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 150
(config-if)#standby 1 ip 172.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config)#int vlan 4
(config-if)#ip add 10.16.32.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 150
(config-if)#standby 1 ip 10.16.32.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#exit
(config-if)#exit
(config)#int vlan 5
(config-if)#ip add 172.16.16.6 255.255.240.0
(config-if)#standby 1 preemp
(config-if)#standby 1 priority 200
(config-if)#standby 1 172.16.16.3
(config-if)#standby authentication md5 key-chain travail@ne
(config-if)#end
#cop r s
PARTIE B
Travail demandé :
Sujet 2
Vous pouvez utiliser le module de votre choix [ssh2-python, netmiko, paramiko, fabric, telnetlib,….]
Avec tuple
Avec liste
CANDIDAT ELECTEUR
1,N VOTER 1,N
numCandidat numElecteur REGION
Voix
nomCandidat nomElecteur numRegion
Jour
prenomCandidat Procuration prenomElecteur region
INSCRIRE 1,N
date_naissCandidat dateNaissElecteur
lieuNaissCandidat 1,N genreElecteur
genreCandidat numPiece
1,N 1,N POSSEDER
1,1 BUREAU
1,1 1,1
numBureau AVOIR
ETRE APPARTENIR 1,1
Cryptage de données
A. A partir des fichiers CSV
B. A partir des tables
Création de comptes
Création d’utilisateurs
192.168.10/24
.93
PostgreSQL
.92
MySQL
.91
Création des tables sous le serveur MySQL Oracle
Création des tables sous PostgreSQL
Exerice 2
Objectif : migrer les données des tables candidat, electeur et vote du serveur MySQL vers celles du serveur
PostgreSQL.
Le script s’exécute sur la machine cliente
Exercice : Migration de données SQL vers NoSQL, cas de MySQL vers MongoDB
192.168.1.0/24
.93 .1 { }
MongoDB
MySQL
import pymysql as M
from pymongo import MongoClient as Mg
from sshtunnel import SSHTunnelForwarder as F
cnS=F(('192.168.1.93',22),ssh_username="root",ssh_password="6858",remote_bind_address=("loc
alhost",3306))
cnS.start()
print(cnS.local_bind_port)
cnMg=Mg("localhost:27017")
col=cnMg["bk"]["mouvement"]
cnL=M.connect(host='localhost',
port=cnS.local_bind_port,user='root',password='mysql',database='bk')
crL=cnL.cursor()
crL.execute("SELECT SUM(cd-db) solde,idct FROM mouvement GROUP BY idct")
for l in crL.fetchall():
col.insert_one({"compte":l[1],"solde":int(l[0])})
cnL.close()
cnS.close()
Exercice : Centraliser les données des serveurs distants MySQL et PostgreSQL dans le serveur MongoDB
{ }
MongoDB
MySQL .1
.92
PostgreSQL
.93
Exercice
crO=cnO.cursor()
crO.execute('SELECT debit,credit,jour,idc FROM mouvement')
d=crO.fetchall()
for d in d:
print(d)
crP.execute('''INSERT INTO mouvement(debit,credit,jour,idc)
VALUES(%s,%s,'%s',%s)''' %(d[0],d[1],d[2],d[3]))
cnP.commit()
Exercice
Exercice
cnLlocalp.close()
cnLlocaloo.close()
cnLlocalo.close()
cnSSHoo.close()
cnSSHp.close()
cnSSHo.close()
Exercice
Exercice
# METHODE 1
import os
import cx_Oracle as O, psycopg2 as P, csv
from sshtunnel import SSHTunnelForwarder as F
parametre=[['192.168.16.19','system','exam2020','1521','business'],
['192.168.16.20','system','exam2020','1521','business'],
['192.168.16.21','postgres','exam2020','5432','business']]
for p in parametre:
cnSSH=F((p[0],22),ssh_username=p[1],ssh_password=p[2],remote_bind_address=('localhost',
int(p[3])))
cnSSH.start()
if p[3]=='1521':
cnLocal=O.connect(p[1]+'/'+p[2]+'@'+p[0]+'/'+p[4],port=cnSSH.local_bind_port)
crLocal=cnLocal.cursor()
table=['client','forfait','abonner']
for t in table:
with open('/home/oracle/%s_.csv'%(t,p[0]),'a') as f:
dl=csv.writer(f,delimiter=';')
crLocal.execute("SELECT * FROM %s"%t)
d=crLocal.fetchall()
for d in d:
dl.writerow(str(d))
os.system("cd /home;scp -r oracle [email protected]:/home/Backup_oracle")
elif p[3]=='5432':
cnLocal=P.connect(host=p[1],user=p[1],password=p[2],dbname=p[4],port=cnSSH.local_bi
nd_port)
crLocal=cnLocal.cursor()
table=['client','forfait','abonner']
for t in table:
with open('/home/postgres/%s.csv'%(t,p[0]),'a') as f:
dl=csv.writer(f,delimiter=';')
crLocal.execute("SELECT * FROM %s"%t)
d=crLocal.fetchall()
for d in d:
dl.writerow(str(d))
os.system("cd /home;scp -r postgres [email protected]:/home/Backup_postgres")
Exercice
Soit la structure de la base de données de gestion de ventes
commande(idc,jour, total)
ligne(idl,qte,prix,#idc)
Reseau:192.168.56.0/24
.1 .102
cnF.close()
cnL.close()
Exerice
) Ecrire un script Shell Linux ou Python qui permet de vérifier si les services mysql, nginx
sont actifs. Au cas où un service est inactif alors alerter l’administrateur
import os
service=['mysql','nginx']
for s in service:
if os.system("systemctl is-active %s"%s):
print(s,'est actif')
else:
print(s,"n'est pas actif")
import os
from datetime import datetime as D
D=str(D.now().date())
service=['mysql','nginx']
r=open("resultat.txt","a")
for s in service:
if not os.system("systemctl is-active %s"%s):
r.write("%s %s n'est pas actif"%(D,s))
import cx_Oracle as O
cn=
cr=
with open('util.csv') as f:
for ligne in f:
x=ligne.split(';')
cr.execute('''CREATE USER '%s' IDENTIFIED BY '%s' DEFAULT TABLESPACE '%s'
QUOTA '%s' ON '%s' ACCOUNT '%s'
''') %(x[0],x[1],x[2],x[3],x[2],x[4])
cr.commit()
import psycopg2 as P
cnP=P.connect("host='127.0.0.1' user='ben' dbname='haraka' password='ben'")
crP=cnP.cursor()
with open('C:\\listUser.txt') as f:
for l in f:
l=l.split(';')
crP.execute('''CREATE USER %s WITH LOGIN CONNECTION LIMIT %s
ENCRYPTED PASSWORD %s VALID UNTIL %s''' %(l[0],l[1],l[2],l[3]))
cnP.commit()
Exercice
import cx_Oracle as O
cn=O.connect('system/[email protected]/gestiondiplome')
cr=cn.cursor()
with open('util.csv') as f:
for ligne in f:
x=ligne.split(';')
cr.execute('''CREATE role '%s''' %(x[0]))
i=x[2].split(',')
for k in i:
cr.execute("GRANT '%s' on '%s' to '%s' " %(x[1],k,x[0]))
cr.commit()
Exercice : charger le contenu d’un fichier dans une table d’une base de données sous Oracle
import cx_Oracle as O
cnO=O.connect('system/[email protected]/orcl')
crO=cnO.cursor()
with open('ajouter.csv','r') as f:
for ligne in f:
l=ligne.split(';')
crO.execute("INSERT INTO etudiant VALUES(%s,'%s')"%(l[0],l[1]))
cnO.commit()
cnO.close()
Exercice : Exporter le contenu d’une table d’une base de données Oracle vers un fichier csv
Exercice: Exporter le contenu d’une table Oracle vers PostgreSQL, sur le serveur local
import pymysql as P
cn=P.connect(host='127.0.0.1',user='root',db='iut',password='')
cr=cn.cursor()
f=input("Entrer la filiere: ")
c=input("Entrer le cycle [1,2]: ")
if f is not None and f.isalpha():
if int(c) in (1,2):
try:
cr.execute('INSERT INTO filiere(filiere,cycle) values(%s,%s)' %(f,c))
cn.commit()
except:
cn.rollback()
cr.execute('SELECT * FROM filiere')
d=cr.fetchall()
for d in d:
print(d)
import cx_Oracle as O
import csv
cnO=O.connect("system/motTpass@localhost/orcl")
crO=cnO.cursor()
class insertion:
def __init__(self,f):
self.f=f
def ajoutAgence(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO agence
VALUES(%s,'%s','%s','%s')"%(l[0],l[1],l[2],l[3]))
cnO.commit()
def ajoutAgent(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO agent
VALUES(%s,'%s','%s',%s,%s)"%(l[0],l[1],l[2],l[3],l[4]))
cnO.commit()
def ajoutExped(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO expediteur
VALUES(%s,'%s','%s',%s)"%(l[0],l[1],l[2],l[3]))
cnO.commit()
def transfert(self):
with open(self.f) as fich:
for ligne in fich:
l=ligne.split(';')
crO.execute("INSERT INTO transfert
VALUES(%s,'%s','%s','%s','%s',%s,'%s','%s','%s',%s,%s,%s,%s)"%(l[0],l[1],l[2],l[3],l[5],l[6
],l[7],l[8],l[9],l[10],l[11],l[12]))
cnO.commit()
class exporter:
def __init__(self,t):
self.t=t
def Exporter(self):
with open("%s.csv"%self.t,'a') as f:
fich=csv.writer(f,delimiter=";")
crO.execute("SELECT * FROM %s"%self.t)
for l in crO.fetchall():
fich.writerow(l)
class cloner:
def Clonner(self,b1,b2,t):
crO.execute("SELECT COUNT(*) nbre FROM %s.%s"%(b2,t))
d=crO.fetchall()
if int(d[0][0])>0:
crO.execute("SELECT * FROM %s.%s"%(b2,t))
d1=crO.fetchall()
for l in d1:
crO.execute("INSERT INTO ")
crO.execute("CREATE TABLE IF NOT EXISTS %s.%s AS SELECT * FROM
%s.%s"%(b2,t,b1,t))
cnO.commit()
#T=exporter('transfert')
#T.Exporter()
Exercice
Exercice
class operation:
def __init__(self,cr):
self.cnO=O.connect("system/ben@localhost:1521/XE")
self.crO=self.cnO.cursor()
self.cr=cr
def migrer(self):
self.cr.execute('''SELECT C.numCompte,nomCompte,dateCreation,
nature,dateOp,montant,naturefonds,affaire,typeService
FROM operation O, service S,affaire A,compte C
WHERE O.numCompte=C.numCompte AND A.idAff=O.idAff
AND S.idService=O.idService ''')
for l in self.cr.fetchall():
self.crO.execute('''INSERT INTO operation
VALUES(seqOp.nextval,utl_raw.cast_to_raw('
{"numCompte":"%s","nomCompte":"%s", "dateCreation":"%s",
"operation":[
{"nature":"%s","dateOp":"%s","montant":"%s",
"natureFonds":"%s","affaire":"%s","typeService":"%s"
}
]
}
')
)'''%(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8]))
print('Operation realisee avec succes')
self.cnO.commit()
#con=connecter('192.168.56.106','ben','ben',3306)
con=connecter('192.168.56.106','ben','ben',5432)
P=con.accesDistant()
#L=con.accesLocalPM(0,"cdc",P) #MySQL
L=con.accesLocalPM(1,"cdc",P) #PostgreSQL
op=operation(L)
op.migrer()
-------------------MySQL
-------------------PostgreSQL
#{'note':5.75,'coef':4,'matiere':'BDD','jour':'2021-02-12','matricule':152}
import cx_Oracle as O
cn=O.connect("system/[email protected]/orcl")
cr=cn.cursor()
cr.execute("SELECT note,ceoff,matiere,jour,matricule FROM etudiant E,matiere M, noter N
WHERE E.ide=N.ide and N.idm=M.idm")
for l in cr.fetchall():
cr.execute('''INSERT INTO noSQL.noter VALUES(seqOp.nextval,utl_raw.cast_to_raw('
{"note":"%s","coeff":"%s","matiere":"%s","jour":"%s","matricule":"%s"}')
)'''%(l[0],l[1],l[2],l[3],l[4]))
cn.commit()
PARTIE 4 :
TD1 : Gestion des diplomes
Voici un extrait de la base de donnees de gestion des diplôme
d=[
{'id':1,'nom':'Moussa','prenom':'Ali','genre':'M','nationalite':'nigerienne','dateNaiss':'1
998-05-14','lieuNaiss':'Dosso',
'diplome':[{'codeDipl':5211,'domaine':'Mathematique','obtenu':'2018-04-
12','niveau':'Licence','etab':'UAM'},
{'codeDipl':1231,'domaine':'Mathematique','obtenu':'2021-07-
13','niveau':'Master','etab':'UAM'},
]},
{'id':2,'nom':'Jika','prenom':'Dodo','genre':'M','nationalite':'nigerienne','dateNaiss':'19
95-05-14','lieuNaiss':'Miriah',
'diplome':[{'codeDipl':5001,'domaine':'Informatique','obtenu':'2017-08-
12','niveau':'Licence','etab':'UZ'}
]},
{'id':3,'nom':'Habibou','prenom':'Aminatou','genre':'F','nationalite':'nigerienne','dateNai
ss':'1999-075-18','lieuNaiss':'Agadez',
'diplome':[{'codeDipl':6211,'domaine':'Marketing','obtenu':'2019-04-
12','niveau':'Licence','etab':'IUT Tahoua'},
Travail demande
1. Donner le nombre de diplômes de licence obtenu par les filles en 2019
2. Donner le nombre de diplômes attribué par établissement en 2020
3. Donner le nombre de diplômes attribué par année, de 2016 à 2020
4. Donner le nombre de diplômes par domaine attribué pour une année de votre choix
5. Donner le pourcentage de diplômes attribué par établissement pour une année de votre choix
6. Donner l’établissement qui a plus attribué de diplômes pour une année de votre choix
7. Donner le pourcentage de diplômes attribué par genre pour une année de votre choix
r=[{"code":"1","nom":"AK","prenom":"AB","dateNaiss":"12/05/1977","lieuNaiss":"L1","national
ite":"nigerienne","genre":"M","contrat":"CDI","employeur":"SemiPublic","diplome":"Licence",
"domaine":"Informatique","annee":"2015","nature":"General","salaireBase":"123206","etat":"l
icencie","loacalite":"Agadez"}
1) le nombre de diplômés recrutés par an (ok)
2) le nombre de diplômés recrutés par an et par domaine
3) le nombre de diplômés recrutés par mois et par domaine
4) le nombre de diplômés recrutés par an, domaine et par genre
5) pourcentage de diplômés recrutés par nature (general/prof) par an
6) diplômés recrutés par CDI ou CDD par an ou par mois
TD 3:
Exercice 1 : gestion de resultats du Bac
voir le fichier joint qui contient la base de données(format json)
Questionnaire
1)lister les candidats de la série D
print(trouveMax())
11) donner la liste des candidats de la serie D qui ont des notes inferieures a 10 en mathématique
print(x['cd'],x['nom'],'Maths:',n1,'Physique
Chimie:',y['n'])
mpInf10('D')
for e in calmoyenne(s):
if e[4]>=10:
L.append(e)
print(tabulate(L,['Mat','Nom','Pren','Moy','Serie'],tablefmt='grid'))
for e in calmoyenne(s):
if e[4]<=10:
L.append(e)
print(tabulate(L,['Mat','Nom','Pren','Moy','Serie'],tablefmt='grid'))
15) donner les candidats ayant des notes inferieures a 10 en Physique et Math en serie C
16) apprecier le resultat:
si moyenne >=10 alors admis
si moyenne >=9.75 et 9.99 alors second group
sinon refuse
for e in calmoyenne(s):
if e[4]>=10:
a='Admis'
elif e[4]>=9.75 and e[4]<=9.99:
a='Second groupe'
else:
a='Refuse'
e+=[a]
L.append(e)
print(tabulate(L,['Mat','Nom','Pren','Moy','Serie','Appreciation'],tablefmt='grid'))
def filleAdmise():
i=j=0
for l in r:
if l['genre']=='F':
i+=1
if calmoyenne(l['cd'])>=10:
j+=1
return round(j*100/i,2)
print(filleAdmise())
19) donner le pourcentage des filles admises et refusees au premier groupe par serie
def filleAdmisRefusee():
i=j=0
for l in r:
if l['genre']=='F':
i+=1
if calmoyenne(l['cd'])>=10:
j+=1
return round(j*100/i,2)
print('Admises:',filleAdmisRefusee())
print('Refusees:',100-filleAdmisRefusee())
d=[
{'c':1,'cl':'IAT','jr':'2022-06-
15','prd':[{'p':'bic','px':75,'q':50},{'p':'regle','px':50,'q':25}]},
{'c':2,'cl':'IAI','jr':'2022-06-
14','prd':[{'p':'bic','px':75,'q':50},{'p':'gomme','px':50,'q':25}]},
{'c':3,'cl':'IAT','jr':'2022-06-
13','prd':[{'p':'mark','px':375,'q':150},{'p':'regle','px':50,'q':25}]},
{'c':4,'cl':'EST','jr':'2022-06-
11','prd':[{'p':'craie','px':25,'q':500},{'p':'mark','px':375,'q':825}]},
{'c':5,'cl':'IUT','jr':'2022-06-
15','prd':[{'p':'bic','px':75,'q':550},{'p':'regle','px':200,'q':25}]},
{'c':6,'cl':'UAM','jr':'2022-06-
11','prd':[{'p':'bic','px':75,'q':500},{'p':'crayon','px':20,'q':1025}]},
]
for x in d:
m=0
for j in x['prd']:
m+=int(j['px'])*int(j['q'])
print(x['c'],'=',m)
2. Que fait ce script ?
p= [
{
"matricule": "501",
"nom": "Ousmane",
"prenom": "Garba",
"datenaiss": "1990-03-12",
"lieunaiss": "ADERBISSINAT",
"nationalite": "nigerienne",
"genre": "H",
"jourIncarseration": "2010-11-28",
"jourJugement": "2011-05-15",
"jourLiberation": "2014-05-28",
"prison": "Koutoukale",
"delit": "Cooruption",
"peine": "12"
},
{
"matricule": "506",
"nom": "Sanoussi",
"prenom": "Hadi",
"datenaiss": "1990-04-17",
"lieunaiss": "Arlit",
"nationalite": "nigerienne",
"genre": "H",
"jourIncarseration": "2011-01-19",
"jourJugement": "2011-07-16",
"jourLiberation": "2015-07-31",
"prison": "Maradi",
"delit": "Tricherie Bac",
"peine": "1"
},
{
"matricule": "511",
"nom": "Hadiza",
"prenom": "manane",
"datenaiss": "1990-05-23",
"lieunaiss": "BILMA",
"nationalite": "nigerienne",
"genre": "H",
"jourIncarseration": "2011-03-12",
"jourJugement": "2011-07-04",
"jourLiberation": "2019-11-19",
"prison": "Niamey",
"delit": "Terriorisme",
"peine": "12"
},
]
Travail demandé :
Différence entre deux dates
import psycopg2 as P
from random import random as R
from tabulate import tabulate
cn=P.connect(host='127.0.0.1',
port=5432,user='postgres',password='ben',database='transferer')
cr=cn.cursor()
class client:
def ajouter(self,n,p,t):
cr.execute("INSERT INTO client(nom,prenom,tel) VALUES('%s','%s',%s)"%(n,p,t))
cn.commit()
def afficher(self,t=''):
if t == '':
cr.execute("SELECT nom,prenom,tel,actif FROM client")
else:
cr.execute("SELECT nom,prenom,cast(tel as varchar) FROM client WHERE tel=%s"%t)
return cr.fetchall()
def modifier(self,t:int,n,p):
cr.execute("UPDATE client SET nom='%s',prenom='%s' WHERE tel=%s"%(n,p,t))
cn.commit()
def desactiver(self,t:int,v=1):
cr.execute("UPDATE client SET actif=%s WHERE tel=%s"%(v,t))
cn.commit()
class transfert:
def rechExpediteur(self,t):
cr.execute('SELECT nom,prenom,tel,idcl from client WHERE tel=%s'%t)
return cr.fetchall()
def rechDestinataire(self,t):
cr.execute('''SELECT T.nom,T.prenom,E.nom,E.prenom,villeEnvoi,villeDest,montant,tel
FROM client E,transfert T WHERE T.idcl=E.idcl and T.tel=%s'''%t)
return cr.fetchone()
def envoyer(self,t,m,d,nd,pd,te,tp=0):
r=str(R()).split('.')[1]
if tp == 1:
f=m*0.04
else:
f=m*0.03
if self.rechExpediteur(te):
i=self.rechExpediteur(te)[0][3]
else:
print("Saisie du nom et prenom du numero: ",te)
n=input("Entrer le nom de l'expediteur: ")
p=input("Entrer le prenom de l'expediteur: ")
if n and p and t:
client().ajouter(n,p,te)
i=self.rechExpediteur(t)[0][3]
else:
print("Erreur de saisie !")
cr.execute('''INSERT INTO
transfert(teldest,villeexp,villedest,montant,frais,typeenv,codeenv,nom,prenom,idcl)
VALUES(%s,'%s','%s',%s,%s,%s,%s,'%s','%s',%s)'''%(t,d,'Niamey',m,f,tp,r,nd,pd,i))
cn.commit()
C=client()
#C.ajouter('Alio','Kadade', 95214577)
#C.modifier(95214577, 'Fatouma', 'Nahantshi')
'''C.desactiver(95214577)
L=[]
for i in C.afficher():
L.append(i)
print(tabulate(L,['Nom','Prenom','Tel','actif'],tablefmt="grid"))'''
T=transfert()
T.envoyer(94360884,30000,'Agadez','Ghaicha','Goumour',80866873,0)
#print(T.rechExpediteur(95214577)[0][2])
PARTIE 5 : Cryptographie
Exerice 1
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
message = input("Entrer le message a crypter: ")
n = len(message)
resultat = ""
k=3
for i in range(n):
c = message[i]
rech = alphabet.find(c)
newrech = rech + k
resultat += alphabet[newrech]
print ("Resultat du cryptage:", resultat)
# ou
def cryptage(k):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
m=input("Message: ")
r=""
for i in range(len(m)):
if alpha.find(m[i]):
r+=alpha[alpha.find(m[i])+k]
return r
print(cryptage(3))
# ou
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
m=input("message: ")
n=len(m)
k=4
r=""
for i in range(len(m)):
loc=alpha.find(m[i])
nloc=(loc+k)%26
r+=alpha[nloc]
print(r)
#ou
def crypto(m:str,k:int,r=""):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(len(m)):
r+=alpha[(alpha.find(m[i])+k)%26]
return r
print(crypto("UNIVERSIE",400))
hacker algorithm de Cesar
a. Cryptage
alpha='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def hackCesar(m):
for i in range(len(alpha)):
trouve=""
for c in m:
if c in alpha:
trouve+=alpha[(alpha.find(c)+i)%26]
print(i,trouve)
hackCesar("HELLO JE SUIS NIGERIEN")
b. deryptage
alpha='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def hackCesar(m):
for i in range(len(alpha)):
trouve=""
for c in m:
if c in alpha:
x=alpha.find(c)-i
if x<0:
x+=len(alpha)
trouve+=alpha[x]
else:
trouve+=c
print(i,trouve)
hackCesar("KHOORMHVXLVQLJHULHQ")
c. attaque but-force
ROT13
def crypto(m:str,k:int,r=""):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(len(m)):
r+=alpha[(alpha.find(m[i])+k)%26]
return r
print("Cryptage: ",crypto("UNIVERSITE",13))
print("Decryptage: ",crypto(crypto("UNIVERSITE",13),13))
# crypter N fois
def crypto(m:str,k:int,r=""):
alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(len(m)):
r+=alpha[(alpha.find(m[i])+k)%26]
return r
m=input("messahe: ")
for i in range(20):
m+=crypto(m,4)
print(m)
Exercice
def renverser(m):
r=""
i=len(m)-1
while i>=0:
r+=m[i]
i-=1
return r
print(renverser("Fraternite Travail Progres"))
192.168.56.0/24
.1 .104
import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
fic=open("finance.cr","ab")
f=F(cle)
with open("note.txt") as fi:
for line in fi:
fic.write(f.encrypt(line.encode("ascii")))
if os.system("ping 192.168.56.92") == 0:
os.system("scp finance.cr [email protected]:/root/")
exercice 7: Crypter le fichier d’un dossier et envoyer le résultat dans le serveur SRV2
import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
Ds=input("Entrer le chemin du dossier source: ")
Dd=input("Entrer le chemin du dossier destination: ")
if os.path.exists(Ds) and os.path.exists(Dd):
for ft in os.listdir(Ds):
if os.path.isfile(ft):
fcr=open("%s/%s.cr"%(Dd,ft),"ab")
for l in open(ft):
fcr.write(f.encrypt(l.encode("ascii")))
if os.system("ping 192.168.56.92") == 0:
os.system("tar cjvf %s.tar.bz2 %s"%(Dd,Dd))
os.system("scp %s.tar.bz2 [email protected]:/root/"%Dd)
Exercice 8:
.92
.93
.1
192.168.56.0/24
import os
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
Ds=input("Entrer le chemin du dossier source: ")
Dd=input("Entrer le chemin du dossier destination: ")
if os.path.exists(Ds) and os.path.exists(Dd):
for ft in os.listdir(Ds):
if os.path.isfile(ft):
fcr=open("%s/%s.cr"%(Dd,ft),"ab")
for l in open(ft):
fcr.write(f.encrypt(l.encode("ascii")))
os.system("tar cjvf %s.tar.bz2 %s"%(Dd,Dd))
for m in 192.168.56.92 192.168.56.93:
if os.system("ping %s"%m) == 0:
os.system("scp %s.tar.bz2 root@%m:/root/"%(Dd,m))
import os,csv
from cryptography.fernet import Fernet as F
cle=F.generate_key()
f=F(cle)
import pymysql as M
cn=M.connect(host="localhost",user="root",password="est",database="banque")
cr=cn.cursor()
for t in ['compte','mouvement']:
with open("%s.csv"%t,"a") as fic:
e=csv.writer(fic, delimiter=";")
cr.execute("SELECT * FROM %s"%t)
for l in cr.fetchall():
e.writerow(l)
fc=open("%s.cr"%t,"ab")
with open("%s.csv"%t) as fic:
for l in fic:
fc.write(f.encrypt(l.encode("ascii")))
os.system("scp %s.cr [email protected]:/root/"%t)
fc.close()
exercice 4: écrire un script qui fait le décryptage des fichiers cryptés précédemment
Hashage
l=['192.168.56.1','127.0.0.1','8.8.8.8','8.8.4.4','1.1.1.1','2.2.2.2']
erreur=open('erreur.txt','a')
for x in l:
if os.system('ping %s'%x) != 0:
erreur.write('%s %s est hors reseau'%(jr,x))
erreur.close()
192.168.56.0/24
5 Script de requêtes sur la table VOTE, exécuté sur les serveurs 192.168.56.92 et 192.168.56.93
from netmiko import ConnectHandler as H
def connection(u:str,p:str,h:str):
conf={'device_type':'linux',
'username':u,
'host':h,
'password':p,
'secret':p,
'timeout':250,
'verbose':True}
return H(**conf)
r='192.168.1.'
for h in [92,93]:
cn=connection("root","6858",r+str(h))
commande=["mysql -u root --password='mysql' vote","SELECT * FROM vote"]
for l in commande:
result=cn.send_command(l)
cn.disconnec()
print(result)
Partie 6
Python & SQLite3
>import sqlite3
conn=sqlite3.connect(‘C:/sqliteDB/master2EST.db')
c=conn.cursor()
‘’’c.execute("CREATE TABLE etudiant(ide integer primary key autoincrement,nom varchar(50) not
null)")’’’
c.execute("INSERT INTO etudiant(nom) VALUES('Ali')")
c.execute("INSERT INTO etudiant VALUES(2,'Moussa')")
c.execute("INSERT INTO etudiant VALUES(3,'Sani')")
conn.commit()
li=c.execute("SELECT * FROM etudiant")
for tab in li:
print(tab[0])
print(tab[1])
print(tab[2])
>import sqlite3
conn=sqlite3.connect('uin4.db')
c=conn.cursor()
def crate_table():
c.execute("CREATE TABLE etudiant(ide integer primary key autoincrement,nom varchar(50)
not null)")
def crate_entry():
c.execute("INSERT INTO etudiant VALUES(1,'Ali')")
c.execute("INSERT INTO etudiant VALUES(2,'Moussa')")
c.execute("INSERT INTO etudiant VALUES(3,'Sani')")
c.close()
conn.close()
-----------------------------
appel
create_table()
crate_entry()
li=c.execute("SELECT * FROM etudiant")
for tab in li:
print(tab[0])
print(tab[1])
print(tab[2])
resultat=tab.etudiant.find() Affichage
for document in resultat:
print(document)
tab.etudiant.create_index([("telephone", pymongo.ASCENDING)]) Création d’un index sur le champ telephone
Excell et Python
import openpyxl
import os
os.chdir('c:\\backup')
wb=openpyxl.load_workbook('exemple.xls')
wb.get_get_sheet_names()
sheet=wb.get_sheet_by_name('categorie')
sheet['A1'].value
sheet['C1'].value=100
wb.save('exemple.xls')
sheet.title='Mes donnees'
wb.save('exemple.xls')
sheet.cell(row=1,column=3).value
for i in range(1,5): print(sheet.cell(row=i,column=3).value)
sheet.max_row
sheet.max_column
openpyxl.cell.get_column_letter(1)
openpyxl.cell.get_column_letter(26)
openpyxl.cell.column_index_from_string('B2')
wb.create_sheet(title='Ma feuille',index=1)
wb.save('exemple2.xls')
sheet.column_dimensions['B'].width=20
wb.save('exemple2.xls')
import xlrd
import MySQLdb
#ouvrir le classeur et definir la feuille
book=xlrd.open_workbook("fichier.xls")
sheet=book.sheet_by_name("source")
sheet=book.sheet_by_index(0)
#connexion a la base de donnees boutique
cn=MySQLdb.connect(host="localhost",user="root",passwd="",db="boutique");
#creation du cursor
cr=cn.cursor()
req="INSERT INTO categorie(categorie) VALUES(%s,%s)"
for r in range(1,sheet.nrows):
categorie= sheet.cell(r,0).value
#assigner les valeurs de chaque ligne excel
values(cotegorie)
#executer le requete SQL
cr.execute(req,values)
#fermer le curseur
cr.close()
#valider la transaction
cn.commit()
#fermer la connexion
cn.close()
#afficher le contenu de la table
columns=str(sheet.ncols)
rows=str(sheet.nrows)
Exemple 2
import psycopg2
from pprint import pprint
class DatabaseConnection :
def _init_(self):
try:
self.cn=psycopg2.connect(
"dbname='etudiant' user='postgres' host='localhost' password='' port='5432'")
self.connection.autcommit=True
self.cursor=self.connection.cursor()
except:
pprint("Connexion a echoue")
'''def create_table(self):
createT="CREATE TABLE if not exists produit(idpro serial primary key,produit varchar(25) not null)"
self.cursor.execute(createT)'''
def insertN(self):
inserer="INSERT INTO produit VALUES(1,'Tomate')"
self.cursor.execute(inserer)
def afficher(self):
aff="SELECT * FRON produit"
self.cursor.execute(aff)
if __name__=='__main__':
dc= DatabaseConnection()
#dc.create_table()
#dc.insertN()
dc.afficher()
-----------------------------
import psycopg2 as pg
cn= pg.connect("dbname='ben' user='postgres' host='localhost' password='ben' port='5432'")
cr=cn.cursor()
Il s’agit ici de la relation PLUSIEURS à PLUSIEURS. Dans ce cas, l’association NOTER devient une table
Donc la table NOTER va hériter des clés de ses tables mères à savoir ETUDIANT et MATIERE
Les champs soulignés sont des clés primaire et les champs précédés de # sont des clés étrangères
#!/usr/bin/env python
#Avoir des informations sur le système d'exploitation Linux
import subprocess
#Fonction 1
def noyauInfo() :
noyau = “uname”
noyau_arg = “-a”
print "Avoir des infos du systeme avec la commande %s :\n" % noyau
subprocess.call([noyau,noyau_arg])
#Fonction 2
def diskInfo() :
espaceDisk = "df"
espaceDisk_arg = "-h"
print "Information sur l'espace disque restant %s :\n" % epaceDisk
subprocess.call([espaceDisk, espaceDisk_arg])
Enregistrer ce fichier sous pysy.py
On peut toutefois ecrire: subprocess.call("df -h",shell=True)
def main():
def noyauInfo()
def diskInfo()
Appel d’une function dans du script
from pysy import diskInfo
Problème :
Lors de l’exécution du script, nous souhaitons que seule la fonction appelée s’exécute. Cela est possible grâce à la
technique d’idiom
def main():
def noyauInfo() def __main__()
def diskInfo()
import matplotlib
import matplotlib.pyplot as pt
pt.plot([1,2,3,4],[3,8,10,25])
pt.show()
import matplotlib fig=pt.figure
import matplotlib.pyplot as pt rect=fig.patch
rect.set_facecolor('green')
fichier=open("C:\\Python34\\fich.txt","r") x=[3,7,8,12]
donnees=fichier.read().split("\n") y=[5,13,2,8]
print(donnees) graph1=fig.add_subplot(1,1,1,axisbg='black')
x=[] graph1.plot(x,y,'red',linewidth=4.0)
y=[] pt.show()
for i in donnees:
c=i.split(',')
x.append(int(c[0]))
y.append(int(c[1]))
pt.plot(x,y)
pt.show()
PANDAS
DataFrame peut contenir des listes, les tableaux NumPy, dictionnaire,...
Exemple1:
inport pandas as pd
import numpy as np
mon_dataFrame = pd.DataFrame([1,2,3])
print(mon_dataFrame)
Exemple 2
cols = ['A', 'B']
idx = pd.Index(list('name'), name='a')
data = np.random.normal(10, 1, (4, 2))
df = pd.DataFrame(data, columns=cols, index=idx)
Création des interfaces
b blue
g green
r red
c cyan
m magenta
y yellow
k black
w white
a.
b.
c.
d.
Exercice 7
Exercice 8
Exercice 9
Exercice 10
Marqueur
Exercice 11
Introductoion a Webio
from index import article
from pywebio.input import input, TEXT,select,input_group
from pywebio.output import output, put_text,put_table
def ajout():
donnee=input_group("Ajouter article",[
input("Entrer l'article",name="article",type=TEXT,placeholder="Article"),
select("Category",['Bureautique' , 'Menage'],name="categorie",required=True)
])
put_text(donnee['article'],donnee['categorie'])
put_table([['Article','Categorie','Menu'],['Bic','Bureautique','x'],['Gomme','Bureautiq
ue','x']])
if __name__ == "__main__":
ajout()
Code de index.py
import pymysql as M
cn=M.connect(host="localhost",port=3305,user="root",password="ben",database="stock")
cr=cn.cursor()
class article:
def ajouter(self,a,c):
cr.execute("INSERT INTO produit(article,idc) VALUES('%s','%s')"%(a,c))
cn.commit()
A. Python et MySQL
Installez : pymysql en ligne avec la commande : pip install pymysql ou python –m pip install pymysql
Activité 1 : Gestion des inscriptions scolaires
Activité 2 : Gestion des membres des clubs
Activité 3 : Gestion des cartes d’identité
Activité 4 : Gestion des diplômes
def afficher():
try:
cr.execute('SELECT * FROM produit ORDER BY id DESC')
da=cr.fetchall()
for d in da:
print(d)
except:
print('Aucun produit')
def inserer():
produit=str(input('Entrer le nom du produit'))
prix=int(input('Entrer le prix du produit'))
quantite=int(input('Entrer la quantite du produit'))
marque=str(input('Entrer la marque du produit'))
try:
cr.execute('''INSERT INTO produit(produit,prix,quantite,marque)
VALUES(%s,%s,%s,%s)''',(produit,prix,quantite,marque))
cn.commit()
print('Insertion effectuee avec success')
except Exception as e:
print('Insertion a echoue :',e)
cn.rollback()
finally:
afficher()
def modifier():
idp=input('Saisissez le numero du produit a Modifier')
produit=str(input('Entrer le nom du produit'))
prix=int(input('Entrer le prix du produit'))
quantite=int(input('Entrer la quantite du produit'))
marque=str(input('Entrer la marque du produit'))
try:
cr.execute('''UPDATE produit SET produit=%s,prix=%s,quantite=%s,marque=%s
WHERE id=%s''',(produit,prix,quantite,marque,idp))
cn.commit()
print('Modification effectuee avec success')
except:
print('Modification a echoue')
cn.rollback()
finally:
afficher()
def rechercher():
produit=input('Entrer le nom du produit que vous cherchez')
try:
cr.execute("SELECT * FROM produit WHERE produit=%s",produit)
da=cr.fetchone()
for d in da:
print(d)
except:
print('Pas de resultat pour votre recherche')
def supprimer():
idp=input('Entrer le numero du produit a supprimer')
try:
cr.execute('DELETE FROM produit WHERE id=%s',idp)
cn.commit()
print('Suppression effectuee avec success')
except Exception as e:
print('Operation de suppression a echoue',e)
cn.rollback()
finally:
afficher()
if __name__ == '__main__':
menu()
except Exception as e:
print('Aucun produit',str(e))
if __name__ == '__main__':
menu()
EPREUVE
CANDIDAT
1,N 1,N Ide
idc
COMPOSER libelle
nom
note coeff
prenom
jour
genre
tel 1,1
dateNaiss
lieuNaiss FILIERE
nat Id
photo filiere AVOIR
cycle
1,N
1,N
CANDIDATER
annee
1,N
MLD
CANDIDAT(idc,nom,prenom,genre,tel,dateNaiss,lieuNaiss,nat,photo)
FILIERE(idf,filiere,cycle)
EPREUVE(ide,libelle,coeff,#idf)
COMPOSER(jour,note,#idc,#ide)
Travail préliminaire
1. LDD
a. Création de la base de données concours
CREATE DATABASE concours ;
b. Création des tables
i. Table candidat
ii.
f. Création de procédures stockées
i. Procédure qui liste les candidats pour une tranche d’âgés
ii. Procédure qui liste des candidats admis et trier la liste par decroissant des moyennes
g. Création des fonctions
h. Création de cluster
2. LMD
a. Insertion des donnees
b. Modification des donnees
c. Suppression des donnees
3. LID
a. Requetes mono-tables
i. Selectionner tous les candidats
b. Requetes multi-tables
i. Chercher les candidats de la filière CPI
ii. Calculer la moyenne de chaque candidat
iii. Donner la liste des candidats admis et trier la liste par ordre décroissant de la moyenne
4. LCD
5. Gestion des utilisateurs
6. Sauvegarde et Restauration des données
7. Securite
8. Replication
Etude de cas 1 : messagerie avec Python + MongoDB
Structure projet
projet
template
Loging.html static
message.html
css
entete.html
fonts
js
Server.py
index.py
from flask import Flask, render_template,url_for,request,session,redirect
import pymysql as pm
cn=pm.connect(host='127.0.0.1',user='root',password='',db='stock')
cr=cn.cursor()
app=Flask(__name__)
app.secret_key='honneur'
@app.route('/')
def login():
return render_template('login.html')
@app.route('/authentic',methods=['POST','GET'])
def authentic():
if request.method=='POST':
compte=request.form['cmp']
motpasse=request.form['mdp']
profile=request.form['profile']
cr.execute("SELECT cmp,mdp FROM admin WHERE cmp='"+compte+"'AND mdp='"+motpasse+"' AND pro='"+profile+"'")
donnees=cr.fetchone()
if donnees is None:
msg='Erreur'
return render_template('erreur.html',msg=msg)
else:
session['cmp']=compte
return redirect(url_for('index'))
@app.route('/quitter')
def quitter():
session.pop('cmp',None)
return redirect(url_for('login'))
@app.route('/accueil')
def accueil():
return render_template('accueil.html')
@app.route('/lister')
def index():
cr.execute('SELECT ida,article,categorie FROM article a, categorie c WHERE a.idc=c.idc')
da=cr.fetchall()
cr.execute('SELECT * FROM categorie')
dc=cr.fetchall()
return render_template('liste.html',da=da,dc=dc)
@app.route('/ajouter',methods=['POST','GET'])
def ajouter():
if request.method=='POST':
try:
article=request.form['article']
idc=request.form['idc']
cr.execute('INSERT INTO article(article,idc) VALUES(%s,%s)',(article,idc))
cn.commit()
msg='ok'
except:
msg='Echec'
cn.rollback()
finally:
return render_template('resultat.html',msg=msg)
#Modification
@app.route('/modification',methods=['POST','GET'])
def modification():
if request.method=='POST':
try:
ida=request.form['ida']
article=request.form['article'+str(ida)]
idc=request.form['idc'+ida]
cr.execute('UPDATE article SET article=%s,idc=%s WHERE ida=%s',(article,idc,ida))
cn.commit()
msg='ok'
except:
msg='Echec'
cn.rollback()
finally:
return render_template('resultat.html',msg=msg)
#fin modification
@app.route('/supprimer/<int:ida>')
def supprimer(ida):
try:
cr.execute('DELETE FROM article WHERE ida=%s',[ida])
cn.commit()
msg='ok'
return render_template('resultat.html',msg=msg)
except:
msg='Echec'
cn.rollback()
return render_template('resultat.html',msg=msg)
if __name__ == '__main__':
app.run(host='localhost',port=8000,debug=True)
templates/index.html
a. script templates/index.html
{% block body %}
<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/bootstrap.min.css')}}">
<script type="text/javascript" src="{{url_for('static',filename='js/jquery.js')}}"></script>
<script type="text/javascript" src="{{url_for('static',filename='js/bootstrap.min.js')}}"></script>
<div class="container-fluid">
<div class="row">
<div class="col-md-offset-6 col-md-4">
<img src="{{url_for('static',filename='logo.png')}}" class="img img-rounded">
<!-- --> </div>
<div class="col-md-offset-4 col-md-5" style="padding-top: 60px;">
b. templates/entete.html
<link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/bootstrap.min.css')}}">
<script type="text/javascript" src="{{url_for('static',filename='js/jquery.js')}}"></script>
<script type="text/javascript" src="{{url_for('static',filename='js/bootstrap.min.js')}}"></script>
<div class="col-md-6 col-md-offset-4">
<ul class="nav nav-tabs">
<li class="active"><a href="/accueil">Accueil</a></li>
<li><a href="/lister">Articles</a></li>
<li><a href="#">Stock</a></li>
<li><a href="#">Service</a></li>
<li><a href="/quitter">Quitter</a></li>
</ul>
</div>
templates/lister.html
{% block body %}
{% include 'entete.html' %}
<div class="col-md-6 col-md-offset-4">
<button class="btn btn-primary pull-right" data-toggle="modal" data-target="#ajout">Ajouter</button>
<table class="table table-bordered table-striped">
<thead>
<tr class="info">
<th width="5%">#</th>
<th width="20%">Article</th>
<th width="20%">Categorie</th>
<th width="20%">Menu</th>
</tr>
</thead>
<tbody>
Bonjour {{ session['cmp'] }}
{% for da in da %}
<tr>
<td>{{ da[0] }}</td>
<td>{{ da[1] }}</td>
<td>{{ da[2] }}</td>
<td>
<button class="btn btn-default"><span class="glyphicon glyphicon-pencil" data-toggle="modal" data-target="#modif{{ da[0] }}"></span></button>
</div>
</div>
</div>
<!--fin modale modification -->
<a href="/supprimer/{{ da[0] }}"><button class="btn btn-danger"><span class="glyphicon
glyphicon-trash"></span></button></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="modal fade" tabindex="-1" aria-labelledby="inscritption" aria-hidden="true" role="dialog" id="ajout">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body">
<form action="{{url_for('ajouter')}}" method="POST">
<input type="text" name="article" class="form-control" placeholder="Entrer l'article" required>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
Travaux dirigés
Dans le but de recevoir les propositions des enseignants, le personnel et les étudiants, le coordonnateur de la
formation MIAGE demande aux étudiants de MIAGE 1 de créer une application mobile.
use messagerie;
);
Figure 1
Travail à faire :
154
Figure 2
Figure 3
155
1. Créer le formulaire de la figure 1 : templates/index.html
156
2. figure 2
157
Templates/code.html
158
Script de la base de données
159
160/3
Gestion de stock avec Flask
import pymysql
from flask import Flask,render_template,redirect,session,request
cn=pymysql.connect(host='localhost',
port=3306,database='stockL1',user='root',password='root')
cr=cn.cursor()
#-----------------------------------------------
app=Flask(__name__)
@app.route('/')
def index():
return render_template("index.html")
@app.route("/authentifier",methods=['POST','GET'])
def authentifier():
if request.method == 'POST':
c=request.form['compte']
p=request.form['motpasse']
cr.execute("SELECT compte,motpasse FROM compte WHERE compte='%s' and
motpasse='%s'"%(c,p))
d=cr.fetchall()
if d:
if d[0][0] == c and d[0][1] == p:
session['c']=d[0][0]
return accueil()
else:
return render_template("erreur.html",e=1)
else:
return index()
@app.route('/accueil')
def accueil():
cr.execute('''SELECT ida,article,categorie,0 as reste FROM categorie C,article A
where C.idcat=A.idcat and
ida not in (SELECT ida from stock) UNION
SELECT A.ida,article,categorie,sum(qtee-qtes) reste FROM categorie C,article
A,stock S
where C.idcat=A.idcat and S.ida=A.ida group by A.idA;''')
a=cr.fetchall()
cr.execute("SELECT * FROM categorie")
C=cr.fetchall()
cr.execute("SELECT * FROM service")
s=cr.fetchall()
return render_template("accueil.html",d=a,c=C,S=s)
@app.route('/ajoutArticle',methods=['POST','GET'])
def ajoutArticle():
if request.method == 'POST':
a=request.form['article']
c=request.form['idcat']
cr.execute("INSERT INTO article(article,idcat) VALUES('%s',%s)"%(a,c))
cn.commit()
return accueil()
@app.route('/nouvelQte',methods=['POST','GET'])
def nouvelQte():
161/3
if request.method == 'POST':
a=request.form['ida']
qe=request.form['qtee']
cr.execute("INSERT INTO stock(qtee,ida) VALUES(%s,%s)"%(qe,a))
cn.commit()
return accueil()
@app.route('/retraitQte',methods=['POST','GET'])
def retraitQte():
if request.method == 'POST':
ids=request.form['ids']
a=request.form['ida']
qs=request.form['qtes']
cr.execute("INSERT INTO stock(qtes,ida,ids,op) VALUES(%s,%s,%s,1)"%(qs,a,ids))
cn.commit()
return accueil()
@app.route('/detail/<int:id>')
def detail(id):
cr.execute("SELECT A.ida,qtee,qtes,op,jour FROM article A,stock S where S.ida=A.ida
and A.ida=%s"%id)
Det=cr.fetchall()
return render_template("detail.html",Det=Det)
if __name__ == "__main__":
app.run(port=7777,debug=True)
Exercice d’application
- Création d’une application de vente des chaussures. En effet, le gestionnaire peut choisir les
chaussures et chaque chaussure choisie est envoyée dans le panier virtuel.
- Le gestionnaire peut visualiser le contenu du panier et décidera de valider sa commande
Remarque : Enregistrez tous les fichiers dans un dossier qui portera vos Nom et Prénoms. Y compris le
fichier du script python.
A la fin, l’administration s’en chargera d’attribuer un numéro anonyme pour la correction
Explications relatives aux champs des tables de la base de données VENTES
Table ARTICLE
Propriété Type Contraintes Explication
numArticle INT PRIMARY KEY Numéro de de l’article. Il est auto incrémenté
prixArticle INT(7) NOT NULL Le prix de l’article
photo TEXT Photo de l’article
Table ACHAT
Propriété Type Contraintes Explication
id INT PRIMARY KEY Identifiant de la table ACHAT. Il est auto incrémenté
162/3
qte INT(7) NOT NULL, la valeur 1 par défaut Quantité de l’article acheté
idCommande INT FOREIGN KEY La clef étrangère fournie par la table COMMANDE
idArticle INT FOREIGN KEY La clef étrangère fournie par la table ARTICLE
Table COMMANDE
Propriété Type Contraintes Explication
id INT PRIMARY KEY Identifiant de la commande, Il est auto incrémenté
jour DATE NOT NULL Date de la commande
Outils de travail :
- SGBDR : SQLITE
- Langage de programmation : PHP (pour la première partie)
- Langage de programmation : PYTHON (pour la deuxième partie)
- Framework : Bootstrap
Travail demandé
2. Programmer le scenario de choix des chaussures et leur envoi dans le panier virtuel avec le
langage PHP. (Voir la figure 1) (11 points)
1. Ecrire le script python qui permettra d’ajouter les articles dans la table ARTICLE (2 points)
2. Ecrire le script python qui permet d’afficher tous les articles ajoutés dans la table ARTICLE
(2 points)
163/3
Figure 1
164/3
Objectifs : créer une application d’authentification des diplômes nigériens. Permettre aux
institutions publiques, privées de vérifier l’authenticité du diplôme avant de recruter ou confier un
poste de responsabilité à une personne détentrice du diplôme. Ce qui permettra de limiter la
circulation des faux diplômes au Niger et garder toujours la crédibilité de nos diplômes.
Le nom de l’application est ADN : Authentification des Diplômes Nigériens
Description du système d’information
A chaque diplôme enregistré correspond un numéro généré automatique. Ce numéro est remis au
détenteur du diplôme. Il introduit ce numéro dans son dossier à chaque fois qu’il souhaite déposer
son dossier de candidature pour un poste de responsabilité.
Pour vérifier l’authenticité du diplôme, l’internaute entre le numéro du diplôme enregistré dans la
base de données. S’il existe un résultat correspondant au numéro saisi alors la page résultat s’affiche
sinon un message s’affiche pour lui indiquer qu’aucune donnée ne correspond à sa demande. Il peut
pourra aussi imprimer le résultat de la recherche.
Outils utilisés :
165
intitule TEXT NOT NULL,
domaine VARCHAR(50) NOT NULL,
dateOb DATE NOT NULL,
etab TEXT NOT NULL,
mention VARCHAR(25) NOT NULL,
nomPro VARCHAR(50) NOT NULL,
prenomPro VARCHAR(50) NOT NULL,
dateNaiss DATE NOT NULL,
lieuNaiss VARCHAR(50) NOT NULL,
tel INT(8) NOT NULL,
photo TEXT NOT NULL
);
create table admin(id int PRIMARY KEY AUTO_INCREMENT,cmp VARCHAR(30) NOT NULL UNIQUE,
mdp VARCHAR(30) NOT NULL,profile INT(1));
insert into admin values(1,'admin','admin',0);
166
Figure 1 :
L’internaute saisit le code du diplôme recherché et il est redirigé sur la page de la figure 2. S’il existe un
résultat correspondant à sa recherche alors il aura les informations souhaitées sinon un message d’erreur
s’affiche.
167
Figure 2 : résultat de la recherche en fonction du code de diplôme saisi.
168
Figure 3 : connexion à l’application.
L’utilisation saisit son compte et mot de passe et coche la case au cas où il s’agit d’un administrateur. Si
l’authentification est réalisée avec succès alors il redirigé vers la page Figure 4. La vérification du compte
et mot de passe se fait dans la table admin sur les champs cmp, mdp et profile
169
Figure 5 : Enregistrement des données dans la table ‘diplôme’.
Pour ajouter un nouveau diplôme, l’utilisateur doit cliquer sur le bouton Ajouter un diplôme et la page
modale ci-dessus.
Pour modifier un enregistrement, l’utilisateur doit cliquer sur le bouton ‘edit, voir le schéma de la
figure ci-dessus
170
Figure 7 : Obtenir les détails sur un enregistrement de la table ‘diplôme’.
Pour obtenir les détails sur un enregistrement l’utilisateur doit cliquer sur le bouton en bleu, voir la
figure ci-dessus
171