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 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 ?
yikes


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 big_smile


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne