Création de processus
Forking
• Cloner des processus
• Fork permet de créer un processus identique au parent
• Le thread en execution est dupliqué exactement au point ou on appel le fork()
• Retourne 0 chez l’enfant
• Retourne le PID de l’enfant chez le parent
• Le PID du parent et de l’enfant sont différents
• Vim fork-demo.py
• #!/usr/bin/env python
• Import os
• Def child_process () :
• Print ‘’ i am a child process and my PID is %d’’%os.getpid()
• Print ‘’the child is exiting’’
• Def parent_process()
• Print ‘’ i am a parent process with PID %d’’%os.getpid()
• Childpid = os.fork()
• If childpid == 0 :
• #we are inside child
• Child_process()
• Else :
• #we are inside a parent process
• Print‘’we are inside a parent process’’
• Print‘’our childhas the PID : %d’’ %childpid
• While true :
• Pass
• Parent_process()
• Chmod a+x fork-demo.py
• ./fork-demo.py
Threading and queues
Threading et files d’attentes
• Créer une queue de taches
• Thread reçoivent les taches
• Threads finalisent la tache et informent la queue
• Tous les thread quittent une fois la queue vide
• Ouvrez votre terminal
• Vim q.py
• #!/usr/bin/env python
• Import threading
• Import Queue
• Import time
• On va commencer par créer la queue des taches
• queue = Queue.Queue()
• Là on va imaginer une classe travailleur qui va récupérer les taches à partir de la queue pour les executer
• #!/usr/bin/env python
• Import threading
• Import Queue
• Import time
• class WorkerThread(threading.Thread) :
• def __init__(self, queue) :
• threading.Thread.__init__(self)
• self.queue = queue
• Queue = Queue.Queue()
• #!/usr/bin/env python
• Import threading
• Import Queue
• Import time
• class WorkerThread(threading.Thread) :
• def __init__(self, queue) :
• Threading.Thread.__init__(self)
• Self.queue = queue
• def run(self) :
• print ‘’in workerThread’’
• while True :
• counter = self.queue.get()
• print‘’Ordered to sleep for %d seconds!’’%counter
• Time.sleep(counter)
• print‘’Finishedsleeping for %d seconds’’%counter
• Self.queue.task_done()
• queue = Queue.Queue()
• Maintenant il faut penser à créer le worker thread
• #!/usr/bin/env python
• Import threading
• Import Queue
• Import time
• class WorkerThread(threading.Thread) :
• def __init__(self, queue) :
• Threading.Thread.__init__(self)
• Self.queue = queue
• def run(self) :
• print‘’in workerThread’’
• while True :
• counter = self.queue.get()
• print‘’Ordered to sleepfor %d seconds!’’%counter
• Time.sleep(counter)
• print‘’Finishedsleeping for %d seconds’’%counter
• Self.queue.task_done()
• Queue = Queue.Queue()
• for i in range(10) :
• Print‘’creating workerThread:%d’’%i
• worker = WorkerThread(queue)
• worker.setDaemon(True)
• worker.start()
• print‘’WorkerThred %d Created!’’%i
• Maintenant nous avons notre worker thread nous avons notre petite boucle et nous avons créée tous nos workerthread
• La grande question ou allons nous poser les taches
• Notre queue a été créée (Queue = Queue.Queue() ) et elle est passée en argument à la création du worker
• #!/usr/bin/env python
• Import threading
• Import Queue
• Import time
• class WorkerThread(threading.Thread) :
• def __init__(self, queue) :
• Threading.Thread.__init__(self)
• Self.queue = queue
• def run(self) :
• print‘’in workerThread’’
• while True :
• counter = self.queue.get()
• print‘’Ordered to sleepfor %d seconds!’’%counter
• Time.sleep(counter)
• print‘’Finishedsleeping for %d seconds’’%counter
• Self.queue.task_done()
• queue = Queue.Queue()
• for i in range(10) :
• Print‘’creating workerThread:%d’’%i
• worker = WorkerThread(queue)
• worker.setDaemon(True)
• worker.start()
• print‘’WorkerThred %d Created!’’%i
• for j in range (10) :
• queue.put(j)
• queue.join()
• Print‘’all tasksover’’
• Enregistrer et quitter
• Python q.py
Solution de l’exercice directory traversal
• #!/usr/bin/python
• import os
• import sys
• pre = ''
• for (path, dirs, files) in os.walk(sys.argv[1]) :
• depth_from_root = len(path.split('/'))
• print '-'*(depth_from_root*4 +8) + ' [' + path.split('/')[-1] + ']'
• for file in files :
• print '-'*(depth_from_root*4 +12) + ' ' +file
• #print '-'*(depth_from_root +12) + ' Files: ' + str(files)
Solution de l’exercice directory traversal
Chmod a+x exo-dir.py ./exo-dir.py ../A/
Programmation client- serveur
Python for security
Programmation réseau
• Programmation des sockets deux types :
• Socket TCP & UDP
• Clients et serveurs réguliers
• Raw Sockets (sockets brutes )
• Sinfing et injection
Programmation client et serveur
• Serveur
• Offre un service
• Client
• Utilise ou consomme un service
• Utilisation du module Socket
Serveur TCP simple et client
• Ouvrez l’interpréteur python
• import socket
• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
• Là vous avez créé une TCP Socket pour écouter sur un port spécifique de la machine serveur
• Nous utilisons la méthode socket qui prend deux arguments
• socket.AF_INET : adress family pour les applications internet on utilise tjr AF_INET
• SOCK_STREAM : le type de socket nous utilisons SOCK_STREAM pour TCP et DATAGRAM socket pour UDP
• Là on a créé notre socket
• Ouvrez l’interpréteur python
• import socket
• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
• tcpSocket.bind((‘’0.0.0.0’’, 8000))
• Les 0.0.0.0 représentent l’adresse de l’interface
• 8000 le numéro de port
• Ouvrez l’interpréteur python
• import socket
• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
• tcpSocket.bind((‘’0.0.0.0’’, 8000))
• tcpSocket.listen(2)
• 2 représentente le nombre de clients concurrents autorisés
• Ouvrez l’interpréteur python
• import socket
• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
• tcpSocket.bind((‘’0.0.0.0’’, 8000))
• tcpSocket.listen(2)
• (client, ( ip, port)) = tcpSocket.accept()
• La méthode accept retourne le couple (client : qui identifie le client avec qui vous etablissez la connexion ce qui veut dire pour chaque nouveau client accepté une
nouvelle socket sera créée) la seconde partie consiste en @ip et n°de port distant du client
• Maintenant ouvrez un autre terminal pour simuler un client
• Taper ifconfig pour verifier l’@ IP du serveur
• nc @ip du serveur 8000
• Rien ne va s’afficher mais le client est connecté
• Revenez vers le 1er terminal
• Client
• Vous aurez comme réponse <socket._socketobject object at 0x……>
• ip
• Vous aurez l’@ip du client
• Port
• Vous aurez le numéro de port distant
• Pour envoyer des informations au client il suffit de faire
• client.send(‘’bienvenue à notre TP’’)
• Vous remarquerez que le message s’affiche chez le client
• De la même manière si vous souhaitez recevoir des données de chez le client
• data = client.recv(2048)
• Sur le client taper ceci est mon premier exemple client serveur
• Revenez au serveur et taper
• data
• Si vous quittez l’interpreteur, il sera automatiquement mis fin à cette liaison
• À la lumière de ce que vous avez vu maintenant vous avez 10mn pour m’envoyer le programme qui permet de créer un écho server
• Un echo server est un serveur qui renvoie tout ce qu’il reçoit vers la source émettrice
• Solution
• while len(data)
• data= client.recv(2048)
• Print ‘’client sent :’’ ,data
• Client.send(data)
• Print ‘’closing connection’’
• client.close()
• print ‘’shutting down server’’
• tcpSocket.close()
• Si le programme serveur est arrété de manière incorrecte vous remarquerez au redemarrage un message d’erreur indiquant
• Errno 98 address already in use
• C’est un problème récurrent
• Pour l’éviter il faut rajouter la ligne suivante juste apres la création de la socket
• tcpSocket.setsockopt(socket.sol_SOCKET, socket.SO_REUSEADDR, 1)