Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: passworteingabe mit timeout
derRichard
12-10-2007, 23:08
hi!
wir würdet ihr eine passworteingabe mit einem timeout rein mit der bash realisieren?
ich hab schon was gebaut, das zwar geht aber meiner meinung ein übler hack ist.
(ich lasse einen counter im hintergrund laufen und kille diesen dann)
vl. kennt jemand eine bessere variante. :)
hier mein code:
#!/bin/sh
t=10
count()
{
while [ $t -gt 0 ] ; do
echo -en "\rEnter Password (${t}): "
t=`expr $t - 1`
sleep 1
done
echo "too late."
kill $1
}
count $$ &
read -s pass
kill $! 2>/dev/null
echo passwort: $pass
danke,
//richard
p.s: ich kenne die "-t" option von read, aber ich will das timeout herunterzählen sehen.
musketaquid
15-10-2007, 14:19
count()
{
for i in `seq -w 10 -1 0`
do
echo -en "\rEnter Password (${i}): "
sleep 1
done
echo "too late."
kill $1
}
Eine etwas elegantere Art für count. mit seq -w erhällst du eine 2 stellige Ausgabe der Zahl.
derRichard
15-10-2007, 14:43
hi!
sorry, aber du hast mein problem gar nicht erkannt.
das hässliche ist, dass ich einen zweiten prozess mit dem count() habe und das möchte ich gern sauberer lösen.
//richard
Moin,
jan@jack:~> for i in `seq 1 10`; do
> read -s -t 1 -p "^MPasswort ($i): " pass
> test $? -eq 0 && break
> done; test -z "$pass" && echo -e "\ntoo late"
Passwort (10):
too late
Das Zeichen "^M" kriegst Du, wenn Du nacheinander <CTRL>-V und <CTRL>-M drückst.
Jan
derRichard
15-10-2007, 20:40
hi!
hui, das schaut ja richtig gut aus.
ich hab nur mit dem ^M ein problem.
in der konsole geht das aber wie gebe ich das in einem editor am besten ein?
bekommt man das ^M nicht durch ein anderes steuerzeichen?
//richard
derRichard
15-10-2007, 20:52
ok, erst denken, dann posten.
das zeichen bekomme ich ja so:
bak=`echo -n -e "\r"`
was ich aber nicht kapiere bei dem code, warum wird "pass" nicht immer überschrieben?
wenn ich zb sowas mache:
read -s xxx
read -s xxx
dann überschreibt read beim zweiten mal den inhalt von xxx.
//richard
...was ich aber nicht kapiere bei dem code, warum wird "pass" nicht immer überschrieben?...
Das liegt an der 3. Zeile. read -t gibt bei abgelaufenem Timeout einen Returncode ungleich Null zurück, sonst 0. In dem Fall hüpft das Script per break aus der Schleife.
Jan
P.S.: Im vim z. B. funktioniert die Tastenkombination <CTRL>-V <CTRL>-M auch ;-)
musketaquid
16-10-2007, 00:34
Da war jemand schneller, aber ich poste es trotzdem mal.
#!/bin/sh
for i in `seq -w 10 -1 0`
do
echo -en "\rEnter Password (${i}): "
read -t 1 -s pass
if [ $? == 0 ] ; then
break
fi
if [ $i == 00 ] ; then
echo ""
echo "too late."
exit 1
fi
done
echo ""
echo passwort: $pass
BLUESCREEN3D
16-10-2007, 15:49
was ich aber nicht kapiere bei dem code, warum wird "pass" nicht immer überschrieben?
wenn ich zb sowas mache:
read -s xxx
read -s xxx
dann überschreibt read beim zweiten mal den inhalt von xxx.
Ja, aber die Eingabe wird erst beim Enter-Drücken an den dann laufenden read-Prozess weitergegeben. Und danach wird die Schleife verlassen. Also hat der letzte read-Prozess das gesamte Passwort erhalten.
edit:
Das Zeichen "^M" kriegst Du, wenn Du nacheinander <CTRL>-V und <CTRL>-M drückst.
Ctrl+v und dann einfach Enter geht auch, aber schöner finde ich:
read -p $'\r'"Passwort ($i): "
Dann geht auch Copy&Paste.
derRichard
16-10-2007, 15:55
hi!
maaa, ist ja klar.
danke für den hint^^
//richard
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.