PDA

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

jan61
15-10-2007, 20:33
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

jan61
15-10-2007, 23:24
...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