Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/01/2008, à 15:09

philpep-tlse

[SCRIP SHELL] problèmes avec un script wifi.sh

Salut à  tous, j'ai l'intention de faire un script (mon premier projet de plus de 10 lignes), donc je viens vous demander de l'aide...

Le script trouve les reseaux disponibles demande à  quel essid on veut se connecter puis on se connecte en dhcp

Voici le script :

#!/bin/bash
echo "############## Script wifi ##############"
echo "##                                     ##"
echo "##Bug report NOSPAM PLEASE ##"
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
        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

Le problème c'est qu'il plante au moment du if, quoi qu'il se passe on tombe dans le else. Pourtant la variable Connect prend bien sa valeur ( 0 si le dhcp marche, autre chose si le dhcp plante)

Je suis sur que c'est une érreur de syntaxe mais je ne vois vraiment pas laquelle...

Puis aussi j'aimerais que dhclient eth1 renvoie ses valeurs dans wifi.log au lieu de les afficher a l'ecran.

Merci pour votre (future) aide tongue

philpep-tlse, qui comme la 'tite gogole code des BUGS.

EDITH, y'a pas une commande pour avoir la coloration syntaxique dans punbb ? Histoire que ce soit pas aussi chiant à  lire pour vous lol

EDITH : Je mettrais les modif sur ce premier post...

Dernière modification par philpep-tlse (Le 24/01/2008, à 06:41)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#2 Le 22/01/2008, à 15:13

iuchiban

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

un test en shell s'écrie [ test ]

donc c'est

if [ $connect -eq "0" ]

http://lea-linux.org/cached/index/Dev-shell_script.html
EDIT : Je précise qu'il faut bien conserver les espaces entre les [ ]

Dernière modification par iuchiban (Le 22/01/2008, à 15:14)


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#3 Le 22/01/2008, à 15:20

johnlege

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Bonjour
Pour tester le résultat d'une comande c'est plutot if [ $? != 0 ]
Ta syntaxe serait donc

Connect=$?
if [ "$Connect" = 0 ]
then
echo alors
else
echo sinon
fi

tu n'as pas besoin des acollades ouvrantes et fermantes entre le if then else

Lorsque tu exécutes une commande, le résultat ou les informations envoyés peuvent être envoyés sur la sortie standard (signe >) ou sur la sortie d'erreur standard (2>), alors si tu veux toujours avoir un résultat en erreur ou pas tu peux faire
commande_unix >>/tmp/toto 2>>/tmp/tata
Si tu ne veux rien voir
commande_unix >/dev/null 2>/dev/null

Un autre truc
pour lancer ton shell script et voir ce qui se passe
sh -x nom_du_shell


Merci d'indiquer résolu dans le titre quand c'est résolu

Hors ligne

#4 Le 22/01/2008, à 15:20

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Exact !
Merci beaucoup, pourtant la syntaxe avait l'air bonne ici : http://doc.ubuntu-fr.org/console/script … s_tests_if

Merci aussi pour ton lien.

Je fait encore quelques ameliorations et je reviens !

EDITH, y'a pas moyen d'avoir l'adresse ip moins brutalement ?

Dernière modification par philpep-tlse (Le 22/01/2008, à 15:26)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#5 Le 22/01/2008, à 15:27

iuchiban

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Pour ton dhclient c'est bizarre en effet car le >> devrait rediriger la sortie standard vers le fichier de log.

EDIT : il me semble que dans ta commande :

ifconfig | grep "inet adr" | sed /127.0.0.1/d | cut -d':' -f2 |

Il manque un d a addr (address prend 2 d en anglais).

EDITH, y'a pas moyen d'avoir l'adresse ip moins brutalement ?

EDIT 2 :
Ben en gros non.

ifconfig | grep "inet" | grep -v "127.0.0.1" | awk '{print $2}' | awk -F ":" '{print $2}'

ifconfig : Tu affiches tes infos de réseau
grep inet : tu veux les lignes des interfaces
grep -v 127 : mais pas celle contenant 127.0.0.1
awk '{print $2}' : je veux le deuxieme bloc "addr:10.253.247.104"
awk -F ":" '{print $2}' : je veux le 2e bloc délimité par ":"

Dernière modification par iuchiban (Le 22/01/2008, à 15:36)


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#6 Le 22/01/2008, à 15:41

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Pour dhclient c'est bon,johnlege a donné la solution :

dhclient eth1 2>> wifi.log

EDIT, dans ifconfig ça s'ecris "inet adr"

Dernière modification par philpep-tlse (Le 22/01/2008, à 15:48)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#7 Le 22/01/2008, à 15:43

freebird

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Voici plusieurs commentaires sur ton code

iwconfig eth1 essid $Essid && dhclient eth1 >> wifi.log ## J'aimerais que rien ne s'affiche à  l'écran

Dans ta ligne de commande tu ne réorientes que les traces standards de la commande "dhclient eth1". Si tu veux tout renvoyer vers ton fichier de logs il faut faire

iwconfig eth1 essid $Essid >> wifi.log 2>&1 && dhclient eth1 >> wifi.log 2>&1
IP=`ifconfig | grep "inet adr" | sed /127.0.0.1/d | cut -d':' -f2 | cut -c1-15` ## On trouve l'adresse ip

Si tu es certain que c'est eth1 il serait plus simple de lancer "ifconfig eth1" pour n'avoir que les infos d'eth1.

EDITH, y'a pas une commande pour avoir la coloration syntaxique dans punbb ? Histoire que ce soit pas aussi chiant à  lire pour vous lol

On est plusieurs à  la souhaiter mais pour l'instant il n'y en a pas.

Hors ligne

#8 Le 22/01/2008, à 15:59

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

freebird a écrit :
IP=`ifconfig | grep "inet adr" | sed /127.0.0.1/d | cut -d':' -f2 | cut -c1-15` ## On trouve l'adresse ip

Si tu es certain que c'est eth1 il serait plus simple de lancer "ifconfig eth1" pour n'avoir que les infos d'eth1.

Tu a raison, j'ai encore changé la commande (pour traiter le cas ou l'ip est de la forme : 1189498498.54949498.14654654.644654.4645)

ifconfig eth1 | grep "inet adr" | cut -d':' -f2 | cut -d'B' -f1

Maintenant je vais tenter une detection automatique de l'interface wifi.

Merci pour ta commande de log, il faut encore que je medite dessus, car c'est encore un peu flou pour moi ces notions.

Je comprend le < le > le >> le 2> et le 2>> mais pas le 2>&1

EDIT ;j'ai changé le premier post avec le nouveau script.

Dernière modification par philpep-tlse (Le 22/01/2008, à 16:06)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#9 Le 22/01/2008, à 16:10

freebird

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Les 2 redirections suivantes reviennent au même :

>> wifi.log 2>&1
>> wifi.log 2>> wifi.log

2>&1 revient à  dire "envoie les traces 2 au même endroit que les traces 1".

Hors ligne

#10 Le 22/01/2008, à 18:25

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Dans ce cas, pourquoi quand je fais :

## Pour la detection de l'interface wifi
iwconfig | cut -d' ' -f1 >> Standart 2>> erreur

Il me revoie à  l'écran :

lo        no wireless extensions.

eth0      no wireless extensions.

Et il n'y a rien dans erreur.

Pour la detection c'est OK mais y'a toujours ce truc qui s'affiche et je ne comprend pas pourquoi... (Il y aurait 2 sortie d'érreur ?)

J'update le script :

#!/bin/bash
## Script wifi.sh
echo -e "\nDetection de l'interface wifi"
Eth=`iwconfig | cut -d' ' -f1`
sleep 1
echo -e "\nOK, votre interface est $Eth"
echo -e "\nRecuperation des essid"
iwlist $Eth scan | grep ESSID | cut -d'"' -f2 | sed /\<hidden\>/d > essid.log ## On recupère les essid
cat -b essid.log
NbEssid=`wc -l < essid.log`
echo -en "\nQuel essid [1-$NbEssid] ?"
read Choix
Essid=`cat -b essid.log | cut -c6- | grep ^$Choix | cut -c3-` ## On recupère l'essid choisi
echo -e "\nVous avez choisi le essid $Essid !"
echo -e "\nTentative de connexion en dhcp sur le essid $Essid !"


## Création du fichier wifi.log
echo -e "########## Fichier wifi.log ##########" > wifi.log ## On vide le fichier wifi.log
echo -e "#### Votre interface wifi est $Eth" >> wifi.log
echo -e "\n#### Commande iwconfig (Choix de l'Essid)\n" >> wifi.log
iwconfig $Eth essid $Essid >> wifi.log 2>> wifi.log
Connect=$? ## Variable d'érreur
if [ $Connect = 0 ]; then
{
        echo -e "\n#### Comande dhclient (Pour la connexion en Dhcp)" >> wifi.log
        dhclient $Eth >> wifi.log 2>> wifi.log
        Connect=$? ## On verifie si le dhcp a reussi
        if [ $Connect = 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 ## En cas d'echec de dhcp
        {
                Sortie=0
                while [ $Sortie != 1 ]
                do
                echo -en "Il y a eu une erreur de dhcp, voulez vous voir le fichier d'érreur ? [O/N]"
                read log
                case "$log" in
                o | O ) cat wifi.log | more && Sortie=1;;
                n | N ) echo -e "\nAurevoir" && Sortie=1;;
                * ) echo -e "\nJe n'ai pas compris votre reponse !";;
                esac
                done
        }
        fi
}
else ## En cas d'érreur de connexion
{
        echo -en "\nIl y a eu une erreur lors de la connexion au reseau $Essid"
        Sortie=0
        while [ $Sortie != 1 ]
        do
        echo -en "\nVoulez vous voir le fichier d'érreurs ? [O/N]"
        read log
        case "$log" in
        o | O ) cat wifi.log | more && Sortie=1;;
        n | N ) echo -e "\nAurevoir" && Sortie=1;;
        * ) echo -e "\nJe n'ai pas compris, vous pouvez répeter ?";;
        esac
        done
}
fi

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

C'est propre ? Ou il y a des astuce de scripteur que je ne connais pas ? tongue


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#11 Le 22/01/2008, à 19:05

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Un autre truc que je me demande...

Comment coder une appli console semi graphique, plus accessible en utilisant touches et racourcis clavier ? (un peu comme moc ou aptitude)

Est ce qu'il existe un truc pour recuperer la touche que tape l'utilisateur ? (même si c'est <entrée> ou les flèches)

Comment faire en sorte qu'un mot soit ecrit en blanc avec un fond bleu ?

Que de question d'un gars qui a hate d'apprendre !

Dernière modification par philpep-tlse (Le 22/01/2008, à 19:07)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#12 Le 22/01/2008, à 22:35

freebird

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Alors il faut que tu comprennes que dans ta ligne de commande

iwconfig | cut -d' ' -f1

tu as 2 exécutions qui génèrent chacune une sortie standard et une sortie d'erreur. Si tu veux virer ce que tu as à  l'écran il faut que tu rediriges les traces d'erreur de la commande iwconfig.

iwconfig 2>> erreur | cut -d' ' -f1 >> Standart 2>> erreur

Pour la mise en forme en mode console regarde du cà´té de la commande tput.

Pour la gestion des saisies clavier pour enter tu pourrais utiliser la commande read mais pour les flèches de direction je ne sais pas.

Dernière modification par freebird (Le 22/01/2008, à 22:36)

Hors ligne

#13 Le 22/01/2008, à 23:26

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Mais c'est bien sur, comment j'ai pu ne pas y penser !
Merci.
Moi j'ai trouvé un bug dans mon script :

Essid=`cat -b essid.log | cut -c6- | grep ^$Choix | cut -c3-` ## On recupère l'essid choisi

En gros ça scanne les lignes qui commencent par $Choix.

Mais si il y a plus de 10 reseau, il va y avoir 2 reseau qui correspondent au critère !
Je m'en occupe...

Mes objectif plus ou moins proches :

-Corriger ce bug
-Integrer la demande de clé WEP (puis WPA tongue) seulement s'il y en a.
-Un choix ip statique
-Un truc qui soit un peu plus joli, mais toujours en console big_smile
-Un fichier de preferences ~/.wifirc (quand il y en aurra besoin)



J'ai une question imediate car je galère grave avec les grep, sed, cut, tr...

Y'a une commande simple qui renvoie le premier mot (séparé par des espaces) de la ligne $i d'un fichier ? Et dans ce cas, est ce que si c'est un nombre il sera interprété comme un nombre ? J'ai fait des test avec la commande set mais j'y arrive pas, le plus dur c'est de faire ça sur la ligne $i mad

Merci encore pour votre aide !
tongue


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#14 Le 22/01/2008, à 23:29

freebird

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

C'est la ligne numéro $choix que tu veux ?

Hors ligne

#15 Le 22/01/2008, à 23:43

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Oui, j'ai trouvé :

sed -n 'ip' fichier  ## Renvoie la ième ligne de fichier

Merci à  google ! big_smile

Et merci pour tput : j'ai trouvé un code à  étudier ici : http://www.commentcamarche.net/faq/suje … mande-tput

Dernière modification par philpep-tlse (Le 22/01/2008, à 23:45)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#16 Le 23/01/2008, à 01:13

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Encore un problème de syntaxe mad

J'essaye de créer un fichier comme ça :

essid1:key ## Par exemple Livebox-265B:off
essid2:key  ## Par exemple Freebox-89AE:on
essid3:key  ## etc

Donc j'arrive à  créer un fichier comme ça :

essid1
key ## Clef de essid1
essid2
key ## Clef de essid2
essid3 ## etc
...

Donc avec une boucle while ça devrait pouvoir le faire :

#!/bin/bash
# Scrip de detection essid:key
iwlist eth1 scan | cut -c21- | grep -v "^[MBQFIPA ]" | grep -v "^Ex" | cut -d':' -f2 | cut -d'"' -f2 > essid.lst
MaxLst=`wc -l < essid.lst`
MaxLst=$(($MaxEssid-2)) ## Pour eviter les 2 lignes vides debut/fin
i=2
while [ "$i" -le "$MaxLst" ] ## Cette ligne plante, même sans les "
do
Ssid=`sed -n $i'p' essid.lst` ## Ssid=ième ligne de essid.lst
Encrypt=`sed -n $(($i+1))'p' essid.lst` ## Encrypt=(i+1)ème ligne de essid.lst
echo "$Ssid : $Encrypt" >> essid.lst2 ## On met tout dans essid.lst2
i=$(($i+2))
done
exit 0

et ça plante sur la ligne while ! tongue
J'ai aucun message d'érreur.
Une boucle infinie ? Dans ce cas je ne la vois vraiment pas !

Help big_smile


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#17 Le 23/01/2008, à 03:22

freebird

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

La petite astuce du scripteur qui galère. Ajoute l'instruction :

set -x

Tu verras ainsi tout ce que fais ton script avec beaucoup de détails.

Je pense que ton erreur se situe dans ces 2 lignes là  :

MaxLst=`wc -l < essid.lst`
MaxLst=$(($MaxEssid-2)) ## Pour eviter les 2 lignes vides debut/fin

Je doute que ton MaxLst soit bien valorisé.

Tu ne voulais pas plutà´t faire ça :

MaxLst=`wc -l < essid.lst`
MaxLst=$(($MaxLst-2)) ## Pour eviter les 2 lignes vides debut/fin

Hors ligne

#18 Le 23/01/2008, à 13:18

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Excuse moi profondement de ma non vigilance; c'est qu'a cette heure ci je ne suis plus très frais.
c'était bien ça...


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne

#19 Le 24/01/2008, à 00:31

philpep-tlse

Re : [SCRIP SHELL] problèmes avec un script wifi.sh

Update du script, voir le premier post
- Gestion des clef wep (avec detection pour voir si il y en a besoin)
- Code un peu plus propre

Ce qu'il me reste à  faire
- Gestion ip statique
- Reécriture complète du script pour qu'il soit plus court et moins buggé ## C'est fait
- Intégration du code dans une fenêtre dialog (et xdialog plus tard)

Dernière modification par philpep-tlse (Le 24/01/2008, à 06:38)


le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS

Hors ligne