Script shell : gestionnaire wifi

philpep-tlse Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai écris un petit script shell (mon premier de plus de 10 lignes). Habitué de la console je voulais me lancer dans la progamation de scripts shell. Puis devant l'offre en matière de gestionnaire wifi je me suis dit que j'aillais voir si je pouvais faire quelque chose en console...

- Network manager de Gnome plante avec certaines cartes wifi, notament celles en usb.
- wicd est très sympa mais en gtk et il nécessite python + quelques libs
- Kwifi de KDE est un peu comme celui de Gnome

Puis j'aime bien les applis consoles legères... (je suis sous fvwm donc j'essaie d'éviter toutes les applis un peu trop gtk/qt)

Fonctionalitées :
-Détection de l'interface wifi
-Detection des reseau et s'il y a besoin de clef wep
-La connexion au reseau de son choix

Bref voilà le script :

#!/bin/bash
echo "############## Script wifi ##############"
echo "##                                     ##"
echo "##Bug report NOSPAM    ##"
echo "##                                     ##"
echo "## Ce script doit être lancé avec les  ##"
echo "## droits root. Si vous avez configuré ##"
echo "## sudo vous pouver le lancer avec     ##"
echo "## sudo ./wifish.sh ou sudo sh wifis.sh##"
echo "## Sinon vous passez en root avec la   ##"
echo "## commande habituelle : su -          ##"
echo "#########################################"


## Detection de l'interface wifi (Eth)
echo -e "\nDetection de l'interface wifi"
Eth=`iwconfig 2>/dev/null| cut -d' ' -f1`
sleep 1
echo -e "\nOK, votre interface est $Eth"

## Detection des essid et des clef qui vont avec dans le fichier essid.lst
echo -e "\nDetection des reseau wifi :"
echo -e "\nn    ESSID           KEY"
iwlist $Eth scan 2>/dev/null | cut -c21- | grep -v "^[MBQFIPA ]" | grep -v "^Ex" | cut -d':' -f2 | cut -d'"' -f2 > essid.tmp
MaxLst=`wc -l < essid.tmp`
MaxLst=$(($MaxLst-2))
Hidden=0
echo -e "<essid>:<key>" > essid.lst
i=2
j=1
while [ "$i" -le "$MaxLst" ]
do
    Ssid=`sed -n $i'p' essid.tmp`
    Encrypt=`sed -n $(($i+1))'p' essid.tmp`
    if [ "$Ssid" = "<hidden>" ]; then
        {
            Hidden=$(($Hidden+1))
        }
    else
        {
            echo "$Ssid:$Encrypt" >> essid.lst
            echo -e "\n$j   $Ssid           $Encrypt"
            j=$(($j+1))
        }
    fi
    i=$(($i+2))
done

## Choix du reseau, avec Essid=essid et Key=on/off
echo -en "\nQuel reseau ? [1-$(($j-1))]"
read Choix
Essid=`sed -n $(($Choix+1))'p' essid.lst | cut -d':' -f1`
Key=`sed -n $(($Choix+1))'p' essid.lst | cut -d':' -f2`
echo -e "\nVous avez choisis le reseau $Essid"

## Création du fichier wifi.log
echo -e "########## Fichier wifi.log ##########" > wifi.log
echo -e "\n## Votre interface wifi est $Eth, vous voulez vous connecter au reseau $Essid avec key=$Key ##" >> wifi.log
echo -e "\n## Commande iwconfig $Eth essid $Essid (Choix de l'Essid) ##" >> wifi.log
iwconfig $Eth essid $Essid >> wifi.log 2>&1
err=$?
if [ "$err" = 0 ]; then
    {
        case "$Key" in
                on ) echo -e "\nClef wep ?"; read Key; iwconfig $Eth key $Key >> wifi.log 2>&1;;
                off ) echo -e "\nPas besoin de clef wep !";;
                * ) echo " ";;
        esac
        echo -e "\n## Comande dhclient (Pour la connexion en Dhcp) ##" >> wifi.log
        dhclient $Eth >> wifi.log 2>&1 ## Cette comande ne revoie jamais d'érreur car $?=0 dans tous les cas ????
        err=`cat wifi.log | grep -c "No DHCPOFFERS"` ## Pour corriger : err=1 si erreur
    }
else
break
fi

## Message de réussite ou d'echec
if [ "$err" = 0 ]; then
{
        IP=`ifconfig $Eth | grep "inet adr" | cut -d':' -f2 | cut -d'B' -f1` ## On trouve l'adresse ip
        echo -e "\nVous être maintenant connecté à l'essid $Essid avec l'adresse ip $IP"
        echo "Aurevoir !"
}
else
{
        while [ "$err" != 0 ]; do
        echo -en "\nIl il y a eu une érreur, voulez vous voir le fichier de log ? [O/N]"
        read log
        case "$log" in
                o | O ) clear; cat wifi.log && err=0;;
                n | N ) echo -e "\nAurevoir !" && err=0;;
                * ) echo -e "\nJe n'ai pas compris, vous pouvez répeter ?";;
        esac
        done
}
fi

## Netoyage
rm wifi.log essid.lst essid.tmp
exit 0







Voila la chose.
J'aimerais que vous testez voir si c'est utilisable sur diverses distributions, parce que j'utilise beaucoup les filtres.

Puis je n'ai jamais eu de cours d'info alors si vous voyez des choses incoherentes dites le moi.
Si vous trouvez des bug ça m'interesse !
Je suis ausi avide d'astuces de progamation !

Mes projet pour la suite :

-Intégration du code dans une interface semi graphique (avec dialog et/ou tput)
-Un choix ip statique avec création d'un fichier /etc/network/interfaces

Merci pour vos réactions. :)
A voir également:

5 réponses

zelda
 
Bonsoir,

Le script fonctionne sous debian Etch
0
ctn
 
moi je n'arrive pas à le faire fonctionner avec Cygwin !!
Qui saurait me dire pourquoi ??
0
Geantbrun
 
Salut , j'utilise la distribution NuTyX et ton script fonctionne dessus ; juste remplacé dhclient par dhcpcd pour nutyx et ça roule impec
Merci
0
math140
 
les points virgules après les instructions ne sont pas necessaires
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Euh... desquels tu parles ?

Ceux des instructions "case...esac" ne sont pas nécessaires, ils sont OBLIGATOIRES !!! ;-\
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
une remarque pour faire suite ç celle de Geantbrun :
Il faudrait avant tout chose tester si les exécutables utilisés exists (dhclient, iwconfig...)
et éventuellement réflechir à mettre dans des variables au début (type makefile) les différents programmes, comme ça, si l'utilisateur veux en changer c'est simple. exemple :
alias DHCP=dhcpclient
if [ ! which DHCP ]
  then echo "le programme de dhcp est introuvable"
  exit 1
fi
0