Pages : 1
#1 Le 26/10/2011, à 18:40
- SocialSupaCrew
Script avec un timer et read
Bonjour,
Je suis en train de créer un script qui ne sert à rien mais c'est pour m'entrainer, donc j'espère être dans la bonne section.
Voici mon script :
#!/bin/bash
echo "debut"
a=`date +"%s"`
while [ -z $pass ] || [ $pass != 'code' ]
do
t=`date +"%s"`
echo "Entrez un mot de passe correct : " &
read pass &
if [ $(($t-$a)) -ge 30 ]; then
break
fi
done
echo "fini"
Donc je souhaiterais au final que le script demande le mot de passe, que s'il est bon (=code) il sort de la boucle et exécute un echo, mais qu'au delà de 30 secondes d'attente il sort de la boucle et exécute un autre echo.
Pour l'instant je n'arrive toujours pas à sortir de la boucle en tapant code.
Si vous voyez une erreur ou alors si vous pouviez me guider vers une solution ça m'aiderai beaucoup.
Merci d'avance.
Dernière modification par SocialSupaCrew (Le 26/10/2011, à 18:44)
Hors ligne
#2 Le 26/10/2011, à 19:04
- Haleth
Re : Script avec un timer et read
Tu peux faire un truc comme ca, pour le timeout (je n'arrive pas à sortir du read..) :
(sleep 30; kill -5 $$)&
trap 'action...' 5
while ...
do
.....
done
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#3 Le 26/10/2011, à 19:50
- SocialSupaCrew
Re : Script avec un timer et read
Ok merci, je vais voir ce que je peux faire avec ça.
Hors ligne
#4 Le 26/10/2011, à 20:21
- pingouinux
Re : Script avec un timer et read
Bonsoir,
Voici le script de départ un peu remanié :
#!/bin/bash
echo "debut"
a=`date +"%s"`
message="fini"
while [ "$pass" != 'code' ]
do
echo "Entrez un mot de passe correct : "
read pass
t=`date +"%s"`
if [ $((t-a)) -ge 30 ]; then
message="trop tard"
break
fi
done
echo $message
Hors ligne
#5 Le 26/10/2011, à 20:29
- Haleth
Re : Script avec un timer et read
Ce qui pose toujours le meme soucis : si l'utilisateur ne rentre rien, il ne sort pas de la boucle
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#6 Le 26/10/2011, à 20:42
- SocialSupaCrew
Re : Script avec un timer et read
Tout d’abord merci de vous être penché sur mon problème.
Je débute un peu dans le script donc je n'ai pas bien saisi comment fonctionne kill et trap, mais j'ai presque réussi à faire ce que je voulais avec.
Par contre le code de Pingouinux est presque bon sauf qu'il faut taper quelque chose pour que le if fasse la vérification du temps, or j'aurais préféré que le message "trop tard" apparaisse 30 secondes après le lancement du script si le code n'est pas trouvé.
Mais je pense que if ne permet pas faire ça.
Hors ligne
#7 Le 26/10/2011, à 20:48
- pingouinux
Re : Script avec un timer et read
C'est exact. Si l'utilisateur s'endort et ne tape rien, on ne sort pas de la boucle. La méthode de Haleth remédie à ce problème.
Hors ligne
#8 Le 26/10/2011, à 20:50
- Haleth
Re : Script avec un timer et read
Non justement, mon truc ne le fait pas non plus :'(
Je pense que tu peut y arriver avec deux scripts (1 global, et un qui gere la récupération du code)
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#9 Le 26/10/2011, à 20:56
- SocialSupaCrew
Re : Script avec un timer et read
Eureka, j'ai trouvé !
#!/bin/bash
echo "debut"
a=`date +"%s"`
message="fini"
echo "Entrez un mot de passe correct : "
while [ "$pass" != 'code' ]
do
read pass &
t=`date +"%s"`
if [ $((t-a)) -ge 30 ]; then
message="trop tard"
break
fi
done
echo $message
Il suffisait de faire le echo juste avant la boucle, et d'exécuter read en même temps que if avec le &
Merci beaucoup à vous deux.
Hors ligne
#10 Le 26/10/2011, à 21:00
- Haleth
Re : Script avec un timer et read
Chez toi ca marche ?
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#11 Le 26/10/2011, à 21:02
- SocialSupaCrew
Re : Script avec un timer et read
En effet je crois que je me suis emballé un peu trop vite.
EDIT : avec ma dernière proposition on ne peut pas taper de mot de passe.
EDIT 2 : Voici ce que j'ai fait avec l'idée de Haleth :
#!/bin/bash
echo "debut"
(sleep 30: kill -5 $$)&
trap "echo trop tard" 5
while [ -z $pass ] || [ $pass != 'code' ]
do
echo "Entrez un mot de passe : "
read pass
done
echo "fini"
c'est presque ça, sauf que le script ne s'arrete pas après le echo trop tard, et que si on rentre des mots de passe faux ça donne une erreur avec kill.
Dernière modification par SocialSupaCrew (Le 26/10/2011, à 21:17)
Hors ligne
#12 Le 26/10/2011, à 21:19
- Haleth
Re : Script avec un timer et read
J'ai trouvé ca :
#!/bin/bash
function passwd {
trap 'pass="d"; return 1' 5
(sleep 5; kill -5 $$ 2 > /dev/null)&
while true
do
read pass
if [ $pass = 'code' ]
then
break
fi
done
}
passwd
echo $pass
exit 0
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#13 Le 26/10/2011, à 21:38
- SocialSupaCrew
Re : Script avec un timer et read
En reprenant ton code j'obtiens ceci
#!/bin/bash
function passwd {
trap 'pass="d"; return 1' 5
(sleep 5; kill -5 $$ 2 > /dev/null)&
while true
do
read pass
if [ $pass = 'code' ]
then
break
fi
done
}
passwd
If [ $pass = 'code' ]
then
echo fini
else
echo trop tard
fi
exit 0
sauf que j'ai l'erreur "opérateur unaire attendu" à la 20ème ligne (deuxième If [ $pass = 'code' ] )
Hors ligne
#14 Le 26/10/2011, à 21:38
- pingouinux
Re : Script avec un timer et read
On y arrive aussi sans fonction, en modifiant un peu le script du #11 :
#!/bin/bash
(sleep 10; kill -5 $$ 2>/dev/null)&
trap 'echo "trop tard";exit' 5
echo "debut"
a=`date +"%s"`
while [ "$pass" != 'code' ]
do
echo "Entrez un mot de passe correct : "
read pass
done
echo "fini"
@Haleth #12 :
ligne n°4 du script : 2> doivent être jointifs
Hors ligne
#15 Le 26/10/2011, à 21:43
- SocialSupaCrew
Re : Script avec un timer et read
Le script du #14 est fonctionnel chez moi.
par contre je ne comprend pas tout dans les ligne 3 et 4.
Hors ligne
#16 Le 26/10/2011, à 21:47
- Haleth
Re : Script avec un timer et read
Tu connais pas les signaux ?
trap '....' 5 = faire ... lorsqu'on recoit le signal 5
On envoye un signal avec la command kill : kill -SIG PID
Ici, PID est le pid du shell : $$
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#17 Le 26/10/2011, à 21:50
- SocialSupaCrew
Re : Script avec un timer et read
Non je ne connaissais pas et maintenant tout s'éclaire, sauf le 2>/dev/null
Hors ligne
#18 Le 26/10/2011, à 21:52
- Haleth
Re : Script avec un timer et read
C'est une redirection d'erreur : au lieu d'afficher les erreurs à l'écran, on les met à la poubelle (/dev/null)
Sinon, lorsque tu rentre le bon passwd, le bout de code qui est en arriere plan s'execute quand meme, mais le PID du shell n'existe plus : tu cherche à envoyer un signal à un process inexistant -> erreur
Avec 2>/dev/null, on ne la voit pas
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#19 Le 26/10/2011, à 21:55
- SocialSupaCrew
Re : Script avec un timer et read
ok, je comprend mieux maintenant.
Merci à vous deux, bonne fin de soirée.
Hors ligne
#20 Le 26/10/2011, à 21:56
- pingouinux
Re : Script avec un timer et read
@SocialSupaCrew #15
Ces 2 lignes reprennent celles de Haleth #2
Ligne 3
On attend 10 secondes (pour les tests, sinon c'était 30). On envoie ensuite un signal (n° 5) au process en cours ($$). Le tout en arrière-fond, pour continuer. La sortie d'erreur du kill est redirigée, pour ne pas avoir de message si on donne le bon code rapidement, car on envoie alors un signal à un process qui est déjà terminé. Voir man kill.
Ligne 4
On indique ce qu'on fait quand on reçoit le signal n°5 : envoi d'un message et fin du programme. Voir man trap.
Est-ce suffisamment clair ?
Ajouté : je suis arrivé après la bataille
Dernière modification par pingouinux (Le 26/10/2011, à 21:58)
Hors ligne
#21 Le 26/10/2011, à 21:59
- SocialSupaCrew
Re : Script avec un timer et read
oui merci beaucoup, j'ai compris pas mal de chose ce soir.
Bonne soirée.
Hors ligne
#22 Le 26/10/2011, à 22:37
- Postmortem
Re : Script avec un timer et read
Salut,
Une autre solution avec l'option -t de read :
#!/bin/bash
echo "Début"
message=OK
while [ -z "$REPLY" ] || [ "$REPLY" != 'code' ]
do
read -t 30 -p "Entrez un mot de passe correct : " || {
message="Trop tard"; break; }
done
echo "$message"
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#23 Le 27/10/2011, à 08:59
- pingouinux
Re : Script avec un timer et read
Bonjour,
@Postmortem #22 :
C'est une solution élégante. La seule chose est que le décompte du temps est remis à zéro chaque fois qu'on entre un mot de passe.
On peut y remédier en modifiant légèrement ton script :
#!/bin/bash
echo "Début"
message=OK
a=`date +"%s"`
while [ -z "$REPLY" ] || [ "$REPLY" != 'code' ]
do
t=`date +"%s"`
timout=$((30-t+a))
[ $timout -gt 0 ] && read -t $timout -p "Entrez un mot de passe correct : " || {
message="Trop tard"; break; }
done
echo "$message"
Dernière modification par pingouinux (Le 27/10/2011, à 09:16)
Hors ligne
#24 Le 27/10/2011, à 15:41
- AnsuzPeorth
Re : Script avec un timer et read
Bjr,
Aller pour s'amuser, voilà comment je procéderai :
#/bin/bash
scriptPID=$$
Question() {
Timer &
timerPID=$!
while true
do
echo "Entrez un mot de passe correct : "
read pass
[[ "$pass" == 1 ]] && break
done
kill -9 $timerPID
echo bonne réponse
}
Timer() {
sleep 10 && echo 'timeout !!!' && kill -9 $scriptPID
}
Question
echo 'bye'
exit
Bon, je sais, kill -9 c'est un peu hard, mais bon
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne