Elaboration de mon premier script, aides diverses

Plop all,

Je commence à mon premier script digne de ce nom. Objectif : mon script exécute verrouillage.sh lorsque mon téléphone portable s’éloigne de mon PC, et deverouillage.sh lorsque mon téléphone s’en rapproche.
Pour détecter si mon téléphone est à procimité, j’utilise l2ping qui ping mon appareil par les dents bleues. Si le ping est impossible, l’appareil est trop loin :smiley:

Bon, mon élaboration pour le moment :
Le script est lancé continuellement, et ping mon phone selon un délai choisi par l’utilisateur. Au bon d’un nombre de ping ratés (nombre choisi par l’utilisateur), le script lance verrouillage.sh et continue à tenter de pinger l’appareil. Lorsqu’un nombre de ping est réussi (encore une fois, ce nombre est choisi par l’utilisateur), le script deverrouillage.sh est exécuté.

Voilà pour le moment, je commence à écrire mon script. Si vous avez une quelconque suggestion, remarque, encouragement, critique, ou autre, ne vous gênez pas :wink:

Duna

PS : Je sais que Blueproximity fait ça, mais je n’arrive pas à le faire fonctionner. Et puis, … j’ai envie d’essayer de le faire moi-même :smiley:

EDIT : Ah, bah voilà, j’ai besoin de votre aide. La commande pour pinger mon appareil est :

l2ping 44:4E:1A:D6:F5:D5 (c’est l’adresse MAC, vous vous en doutez :p). Le problème est que cette commande doit être exécutée en tant que root. Mais lancer tout mon script en root n’est-il pas un peu… barbare ? Y’a-t-il moyen de donner l’autorisation à mon script de lancer un processus en tant que root ?
Merci d’avance :wink:

[quote=“Dunatotatos”]Plop all,

Y’a-t-il moyen de donner l’autorisation à mon script de lancer un processus en tant que root ?
Merci d’avance :wink:[/quote]

sudo ?

Mais sudo demande un mot de passe. (sauf s’il y a moyen de le passer par cette commande … ==> man :p)

tu peux le configurer pour qu’il ne demande pas le mot de passe pour certains (ou tous) exécutables

Ca se passe via la commande (en root) :
visudo

puis rajoute la ligne :

ton_user   ALL=NOPASSWD: /user/bin/l2ping

Ton_user aura alors le droit d’executer l2ping sans mot de passe, avec les droits de root pour peut que tu lui fasse précéder “sudo”

Edit : man ou andesi.org/logiciels/systeme … -avec-sudo pour plus d’info

Parfait, tout pile ce qu’il me faut. Merci :smiley:

Nouvelle question : si l’on souhaite manipuler des “booléens” en bash, le 0 est bien équivalent à vrai ?
Par exemple :

bool='0' if [ $bool ] echo "vrai" fi
renverra vrai ? Si c’est le cas, c’est vraiment perturbant. Mais pourtant, il me semblait que la boucle infinie, même en bash, s’écrivait while [ 1 ] …

EDIT : J’ai craqué. Par contre, j’ai deux autres questions concernant les booléens :

  1. Existe-t-il un opérateur pour le xor / oux / ou exclusif ?
  2. Quelle est la bonne syntaxe pour ceci :

if [ $link || $locked ] && ![ $link && $locked ] ; then ... else ... fi (c’est un xor en fait. Même si la réponse à la première question simplifie l’écriture de ce code, pourriez-vous tout de même me le donner avec des && et || s’il-vous-plaît ? Histoire que je sache correctement les enchaîner)

Merci d’avance :wink:

Dans ton code, quelque soit la valeur de bool, tant que celle ci n’est pas vide, ca te renverra un vrai.
Je crois d’ailleurs que ca n’existe pas le booleen en bash, pas plus que le int, char… c’est un langage non typé

  1. Existe-t-il un opérateur pour le xor / oux / ou exclusif ?
    Ll me semble que c’est le ^

J’ai tenté d’utiliser le ^, mais je n’ai pas réussi à obtenir ce que je voulais. Bon, mon script fonctionne, mais c’est un peu barbare :

[code]#!/bin/bash

Configurable

mac='44:4E:1A:D6:F5:D5’
delay='5’
nb_ping_failed='2’
nb_ping_success=‘2’

END !!

let “locked=0” #Etat de l’écran
while [ 1 ]
do
if [ $locked -ne 1 ] ; then
let "nb=$nb_ping_success"
else
let "nb=$nb_ping_failed"
fi
let "i=nb"
while [ $i -ne 0 ] #Tant que la connexion n’a pas foiré plus de fois qu’imposé (i décroît)
do
sleep $delay
if [ sudo l2ping $mac -c 1 | grep "0% loss" -c -eq 1 ] ; then #vaut 1 si l2ping contient "0% loss"
echo "Connexion réussie"
let "link=1"
else
echo "Connexion ratée"
let "link=0"
fi
let “a = (link + locked) % 2” # c’est juste un xor. Petite astuce pour éviter d’avoir à faire 2 paires de tests
if [ $a -eq 1 ] ; then
let "i=nb"
echo "test restant : $i"
else
let "i-=1"
echo "test restant : $i"
fi
done #On sort de la boucle quand la connexion a réussi ou foiré trop de fois
if [ $locked -eq 1 ] ; then
echo "Déverrouillage"
sh deverrouillage.sh
let "locked=0"
else
echo "Verrouillage"
sh verrouillage.sh
let "locked=1"
fi
done[/code]

En particulier, je n’ai pas réussi à comprendre comment utiliser correctement les conditions (cette absence de type booléen est déstabilisante :p), d’où mon acharnement sur les opérations sur entiers.
Si vous avez une quelconque idée d’amélioration, je suis preneur !

Merci pour ton aide dric64 :wink:

EDIT : J’ai un peu commenté mon code. C’est quand même plus compréhensible :stuck_out_tongue:

Pour les booléens, on utilise en général les commandes true et false. Par exemple, pour faire une boucle infinie :

while true ; do [...] done

Pour les and/or, il faut :

  • soit utiliser -a ou -o

if [ EXP1 -a EXP2 ]; then CMD fi
CMD sera exécuté si EXP1 et EXP2 sont vraies.

  • soit utiliser des doubles crochets, pour pouvoir mettre des && ou || :

if [[ EXP1 && EXP2 ]]; then CMD fi
Idem

Pour le xor, je ne sais pas…

Bonjour

& bitwise and &= "bitwise and-equal" | bitwise OR |= "bitwise OR-equal" ~ bitwise negate ! bitwise NOT ^ bitwise XOR ^= "bitwise XOR-equal"

edit: source “advance bash scripting guide”

pas de quotes autour de tes entiers sinon, à mon avis tu manipules des chaines de caractères au lieu d’entiers (en tout cas tu n’as pas besoin de quotes)

sinon fais très attention aux espaces dans tes scripts, en bash la présence ou l’absence d’un espace te fait passer de syntax error à “tout va bien” très rapidement =)

Bonjour,

[quote=“Dunatotatos”]Nouvelle question : si l’on souhaite manipuler des “booléens” en bash, le 0 est bien équivalent à vrai ?
Par exemple :

bool='0' if [ $bool ] echo "vrai" fi
[/quote]

Les booléens existent en bash :

unBool=false
# if; then, else traditionnel
if ${unBool}; then echo "Vrai"; else echo "Faux"; fi
# autre méthode 
${unBool} && echo "Vrai" || echo "Faux"

La question c’est faut il apprendre bash ou sh ?

À ce sujet, il y a eu de menus soucis lors du passage de bash à dash comme shell par défaut pour /bin/sh, initié si j’ai bonne mémoire par Ubuntu puis mis en place quelque temps après par Debian (sid/squeeze).
L’avantage c’est que ça a permis de nettoyer les quelques scripts qui utilisaient des extensions “propriétaires” à bash.

Conclusion : vaut mieux essayer de se restreindre aux standards (donc, sh / dash).

Par contre, j’avoue avoir un faible pour les expressions régulières ~= intégrées à bash, pour les gros scripts ça améliore énormément les performances par rapport à des processus externes (sed, perl, grep, …). Ce qui en soi n’est pas très gênant tant que le script a le bon en-tête #!/bin/bash, et à condition qu’il ne soit jamais sourcé par un script tournant sous dash ou autres !

Salut,

Rappel : Si vous vouliez bien ouvrir un post par sujet, comme vous avez accepté de le faire en vous inscrivant, vous faciliteriez la recherche de ceux qui se donnent le mal de l’effectuer avant de poser des questions.
Il n’y a que dans pause café où l’on entretient une conversation “à batons rompus” :mrgreen:

[quote=“ggoodluck47”]Salut,

Rappel : Si vous vouliez bien ouvrir un post par sujet, comme vous avez accepté de le faire en vous inscrivant, vous faciliteriez la recherche de ceux qui se donnent le mal de l’effectuer avant de poser des questions.
Il n’y a que dans pause café où l’on entretient une conversation “à batons rompus” :mrgreen: [/quote]
Mon post n’était pas hors sujet. Il visait à attirer l’attention sur les choix fait dans l’apprentissage.

Bonjour,

Voici :

[code]
#!/bin/bash

Configurable

mac='44:4E:1A:D6:F5:D5’
delay=5
nb_ping_failed=2
nb_ping_success=2

folder=${0%/*}

locked=true
while true
do
${locked} && nb=${nb_ping_success} || nb=${nb_ping_failed}
i=${nb}
while ((i>0)) #Tant que la connexion n’a pas foiré plus de fois qu’imposé (i décroît)
do
sleep ${delay}
# si l2ping contient "0% loss"
sudo l2ping ${mac} -c 1 > >(grep -q “0% loss”) && {
echo "Connexion réussie"
link=true
} || {
echo "Connexion ratée"
link=false
}

	${locked} ^ ${link} && ((i--)) || i=${nb} 
	echo "Test restant : ${i}"

done
${locked} && {
echo “Déverrouillage”
${folder}/deverrouillage.sh
locked=false
} || {
echo “Verrouillage”
${folder}/verrouillage.sh
locked=true
}
done[/code]

Voilà, je n’ai pas testé mais ce doit être ce que tu cherches.

Sur une bonne parties des distributions récentes, le lien /bin/sh pointe vers le bash.

[quote=“ggoodluck47”]Salut,

Rappel : Si vous vouliez bien ouvrir un post par sujet, comme vous avez accepté de le faire en vous inscrivant, vous faciliteriez la recherche de ceux qui se donnent le mal de l’effectuer avant de poser des questions.
Il n’y a que dans pause café où l’on entretient une conversation “à batons rompus” :mrgreen:[/quote]

Personne n’est visé directement ! mais quel “mot” devrais-je employer pour que ma recherche aboutisse sur votre post ?

Un post par problème sauf dans Pause Café :mrgreen:

Je sais pas on est dans un sujet de quelqu’un qui commence à apprendre le scripting shell. Je vais pas ouvrir un fil pour poser la question de la pertinence de ce qu’on lui montre. (je ne parle pas du post de syam, mais du miens)

Re,

Totor, je suis désolé d’avoir à te rappeler pour la dernière fois que comme tout le monde sur ce forum tu poses une question par post me si tu as plusieurs questions à poser :mrgreen:

Mes excuses totor tu n’y es pour rien ! Mais vous avez accepté un règlement, pensez à ceux qui se posent une question précise, vous croyez qu’ils pourront bénéficier de ce post ?