Archives de catégorie : Python

[Python] : quelques minutes avec Tkinter (GUI)

Tkinter est un module graphique pour python, un GUI (Graphical User Interface). Bien sûr, cet article intéressera les débutants car il s’agit de découvrir le module le plus simplement possible mais avec un exemple « concret ». Je dis concret en double quotes car en fait ce n’est pas si utile que cela mais il faut bien avoir un but pour développer et écrire quelques lignes de codes.

Pour apprendre, je vous propose de réaliser un petit soft qui va avoir deux boutons (un pour quitter, l’autre pour lancer une action). L’action consistera à réaliser la liste des répertoires de ma home « ~ ». Et on affiche tout cela dans une fenêtre spécifique. Comme ceci :

file_manager

Nous utiliserons deux modules :

  • tkinter pour l’interface graphique
  • os : pour lister les répertoires au niveau de notre système
#!/usr/bin/python
#coding: UTF-8
import os
from Tkinter import *

def affichageRepertoires():
    path = os.path.expanduser("~/")
    for f in os.listdir(path):
        cadre2.insert(END, f + "\n")

if __name__ == '__main__':
    principale = Tk()
    cadre1 = LabelFrame(principale, text="FILE MANAGER", font="Arial 14")
    cadre1.grid(row=0, columnspan=2, sticky='E')

    Button(cadre1, text="Afficher répertoire", font="Arial 8", command=affichageRepertoires).grid(row=1, column=1)
    Button(cadre1, text="Quitter", font="Arial 8", command=principale.quit).grid(row=1, column=2)

    cadre2 = Text(master=principale)
    cadre2.grid(row=2, column=1, sticky=NW)
    
    cadre3 = Scrollbar(principale, orient=VERTICAL, command=cadre2.yview)
    cadre3.grid(row=2, column=2, rowspan=15, columnspan=1, sticky=NS)
    cadre2.config(yscrollcommand=cadre3.set, font=('Arial 8'))

    root.mainloop()

Les différentes lignes de codes permettent :

  1. codage en UTF8 (pour ne pas avoir de problème avec les accents)
  2. import des deux modules
  3. création d’une fonction  affichageRepertoires() :
    1. utilisation de os.path : pour récupérer les chemins
    2. parcourir la liste obtenue
    3. afficher les éléments dans le cadre 2 avec un renvoi à la ligne à chaque fois
  4. le bloc principal :
    1. création de la fenêtre principale
    2. définition du premier cadre de type Label (avec titre intégré)
    3. placement du cadre 1 aligné à droite dans la fenêtre et sur la première ligne d’une grille « imaginaire »
    4. ajout des deux boutons dans le cadre 1 avec le texte qui correspond et surtout la commande qui va avec. Pour le premier la commande lance notre fonction affichageRepertoires() pour le second elle quitte la fenêtre « principale ». Attention l’alignement se fait toujours sur notre grille mais en ligne n°1 et colonne 1 puis 2 en fonction du bouton.
    5. création du cadre 2 dans la fenêtre « principale ». Ce cadre sera alimenté par la fonction affichageRepertoires().
    6. la grille nous permet une fois de plus de placer notre cadre en ligne n°2/colonne n°1 et aligné en haut à gauche (NW : nord ouest)
    7. le cadre 3 consiste à ajouter la barre de défilement dans la fenêtre « principale » en se basant sur la fenêtre cadre 2 (command)
    8. Positionnement de cadre 3
    9. Configuration du cadre 2 avec la barre de défilement de cadre3

Tkinter pour python fait partie des modules très bien documentés. Vous pouvez consulter cette page en français et pour être plus complet cette page en anglais.

 

[Sécurité] : scapy – scanner les réseaux wifi (SSID) et leur adresse MAC

Scapy, un mot qui peut faire peur car fait référence à certaines pratiques obscures en matière de sécurité. Effectivement, scapy fait partie des outils de base des hackers… peu importe leur couleur. Retrouvez la documentation en ligne ici et mes autres post python ici.

IMG-3211

Scapy permet notamment de faire de nombreuses opérations sur les réseaux comme sniffer, envoyer des paquets, scanner…

Ne vous inquiétez pas je ne suis pas obscure. Il s’agit simplement de l’envie de découvrir cet outil dont on entend si souvent parler. Aujourd’hui j’ai voulu découvrir comment scanner les réseaux wifi autour de moi (à priori rien d’illégale là-dedans… après cela dépend de ce que l’on fait avec le scan).

Première chose à faire installer scapy :

pip install scapy

C’est donc un simple module que je peux ajouter à python.

Je me reporte ensuite à cet article qui propose de scanner les réseaux wifi. Il me faut donc installer aircrack-ng pour avoir accès à la comande airmon-ng. Aircrack est un binaire qui permet de réaliser de nombreux opérations de pénétrations de réseaux wifi (cracjing de clé…).

└─ $ ▶ sudo apt-get install aircrack-ng

Airmon-ng va nous permettre de devenir observateur du réseau (sans action dessus). Je lance donc airmon sur mon interface wifi :

sudo airmon-ng start wlp3s0

Voilà pour la première étape donc. Maintenant il faut créer un fichier python qui va utiliser le module scapy (je me reporte à la page citée précédemment… on vera pour faire notre propre script plus tard).

Je créé un fichier scapy_scan.py avec ceci :

from scapy.a:qll import *
ap_list = []
def packetRecup (pkt) :
    if pkt.haslayer (Dot11) :
        if pkt.type == 0 and pkt.subtype == 8 :
            if pkt.addr2 not in ap_list :
                ap_list.append(pkt.addr2)
                return "Réseau SSID: %s et MAC address: %s " %(pkt.info, pkt.addr2)
sniff(iface = "mon0" , prn = packetRecup)

Que contient ce script ?

Conclusion : scapy est un outil qui à l’air simple à utiliser et à apprendre. Bien sûr il faut connaitre python avant toute chose et faire attention de ne pas partir sur des tentatives plus obscures dans l’utilisation de cet outil. Je pense que je me ferais encore quelques tests sur  mon réseau local notamment tenter de sniffer des paquets et de faire des envois car c’est un peu la base de l’outil.

Et vous vous utilisez scapy ?

[Python] : Comment mettre en place un padding (retrait) sur votre sortie standard ?

Padding, je ne suis pas sûr que le terme soit tout à fait adapter. Mais en même temps je ne sais pas comment expliquer ce que je veux vous montrer.

Concrètement je dirais comment centrer un texte en l’entourant de caractères particuliers (spéciaux souvent) ? voici ce que nous cherchons à obtenir :

#####Bonjour#####

Ce genre d’affichage peut être sympa sur la sortie standard lorsque vous exécutez vos scripts. Ainsi vous pouvez faire des blocs et faire des mises en forme plus sympas.

Alors comment faire avec python ?

>>> text="bonjour"
>>> "{:#^20}".format(text)
'######bonjour#######'

Une autre ligne de commande fonctionne également :

>>>format(text, '*^20')

Le padding centré est incrémenté par le caractère « ^ ».

Pour réaliser un simple padding à gauche (un retrait à gauche), vous devriez passer la commande suivante :

>>>format(text, '>20')

Et le retrait à droite pour la forme :

>>>format(text, '<20')

Pour en savoir un peu plus sur ce sujet, consultez la doc officielle python des spécifications des formats sur cette page.

[Python] : comment simplifier vos switch case avec la fonction lambda ?

Lambda, un mot qui peut faire peur pour les débutants en python. Pourtant les fonctions anonymes lambda permettent de simplifier le code et de le rendre plus compact. Certe leur lecture nécessite un peu de pratique mais elles réduisent la longueur de vos scripts.

En voici encore un exemple avec le classique switch/case. Python n’est pas équipé d’outils spécifique comme bash, php ou autres… Du coup il faut passer par le classique « If … elseif … else ». C’est dommage et je dirais que c’est presque moche non ?

C’est là que labda le vengeur masqué intervient et va nous réduire et embellir tout cela.

Voyons le cas classique dans un premier temps

def sans_lambda(op, a, b):
    if op == 'addition':
        return a + b
    elif op == 'soustraction':
        return a - b
    elif op == 'multiplication':
        return a * b
    elif op == 'division':
        return a / b
    else:
        return None

Et maintenant avec lambda :

def avec_lambda(op, c, d):
    return {
        'addition': lambda: c + d,
        'soustraction': lambda: c - d,
        'multiplication': lambda: c * d,
        'division': lambda: c / d,
    }.get(op, lambda: None)()

Vous le voyez avec lambda c’est mieux. Une lambda pour chaque cas. On intègre directement cela dans le return.