PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : perl: Passworteingabe mit '*'-Echo



Xanti
15.02.2006, 15:48
Hallo,

eine Anfrage hier im Forum bezüglich Passworteingabe mit *-Ausgabe für jeden Buchstaben (siehe hier (http://www.unixboard.de/vb3/showthread.php?t=17966))
hat mich auf die Idee gebracht, dies mal unter perl zu probieren. Folgendes hab ich bis jetzt:



#!/usr/bin/perl
use Term::ReadKey;

ReadMode 'noecho';
do {
$key = ReadKey 0;
$pass .= $key;
print '*'
} until ($key eq "\n");
ReadMode 0;


Leider scheint ReadKey die Ausgabe zu blockieren, was sich darin zeigt, dass die Sterne erst nach Abschluss der Eingabe mit <Enter> ausgegeben werden.

Vielleicht hat jemand schon mal sowas programmiert und könnte mir auf die Sprünge helfen ;)

Gruss, Phorus

Wolfgang
15.02.2006, 17:46
Hallo Phorus
Dann solltest du eventuell die Eingabe entpuffern.
$|=1;
Kann es gerade nicht testen, da ich das Modul hier nicht installiert habe.

HTH
Gruß Wolfgang

Xanti
15.02.2006, 18:08
Hallo Wolfgang,

hat leider keine Änderung gebracht.

Gruss, Phorus

Wolfgang
15.02.2006, 18:51
Hallo
Wenn ich mich recht erinnere, geht das nur mit
ReadMode ('raw');

Schau es mir später nochmal an, habe momentan wenig Zeit.

Gruß Wolfgang

Xanti
15.02.2006, 18:58
Klasse, das wars. Mit 'raw' gehts. Danke Wolfgang.

edit: der Vollständigkeit halber hier mein funktionierender Code



...
sub getpassphrase {
print "enter passphrase: ";
ReadMode 'raw';
my $passphrase;
while (1) {
my $key .= (ReadKey 0);
if ($key ne "\n") {
print '*';
$passphrase .= $key
} else {
last
}
}
ReadMode 'restore';
return $passphrase
}
...


Dieses if-konstrukt in der while-Schleife nutze ich, damit ich beim Enter-Drücken kein '*' bekomme.

p.s.: $|=1 ist nicht nötig.

Wolfgang
15.02.2006, 21:09
Klasse, das wars. Mit 'raw' gehts. Danke Wolfgang.

edit: der Vollständigkeit halber hier mein funktionierender Code



...
sub getpassphrase {
print "enter passphrase: ";
ReadMode 'raw';
my $passphrase;
while (1) {
my $key .= (ReadKey 0);
if ($key ne "\n") {
print '*';
$passphrase .= $key
} else {
last
}
}
ReadMode 'restore';
return $passphrase
}
...


Dieses if-konstrukt in der while-Schleife nutze ich, damit ich beim Enter-Drücken kein '*' bekomme.

p.s.: $|=1 ist nicht nötig.

Hallo Phorus
Ja, das $| is nicht nötig, weil das Entpuffern ja vom Modul übernommen wird.

Dein If Konstrukt ließe sich aber etwas kürzen.


...
while (1) {
last if ($key eq "\n");
my $key .= (ReadKey 0);
print '*';
}


Das ist aber nicht zwingend.
Weil ich tippfaul bin, würde ich das wohl so machen.
;)

Gruß Wolfgang

Xanti
15.02.2006, 21:19
Hallo Phorus
Ja, das $| is nicht nötig, weil das Entpuffern ja vom Modul übernommen wird.

Dein If Konstrukt ließe sich aber etwas kürzen.
...
Das ist aber nicht zwingend.
Weil ich tippfaul bin, würde ich das wohl so machen.
;)
Gruß Wolfgang

Ich bin für jede Verkürzung meines Quellcodes dankbar, schließlich bin ich schon bei 300 Zeilen :think:


Nur ein kleiner Fehler:


last if ($key eq "\n");


sollte



last if ($key =~ /\n/);


sein, oder?

Gruss, Phorus

edit: Leider hab ich bei Deinem Beispiel trotzdem das Problem, dass <Enter> ein '*' liefert.

edit2: So gehts:



while (1) {
$passphrase .= (ReadKey 0);
last if ($passphrase =~ /\n/);
print '*';
}
chop $key;

Wolfgang
15.02.2006, 21:46
Hallo
Ja stimmt, Fehler von mir.
Das ist klar, weil die Runde ja trotzdem absolviert wird.
So schnell landet man in der Falle.


Gruß Wolfgang
PS Konnte es nicht testen, sonst wär ich wohl eher darauf gestoßen.

Ich werde langsam zu alt dafür. ;)

last if ($passphrase=~/^\n/); ist wohl genauer.

Xanti
15.02.2006, 21:48
...
Ich werde langsam zu alt dafür. ;)

Quatsch, warst 'ne grosse Hilfe.

edit:



last if ($passphrase=~/^\n/); ist wohl genauer.


..., wennschon
last if ($passphrase=~/\n$/) ;)

p.s.: Wenn diese Abfrage fehlerhaft ist, kann nicht mal Ctrl+C das Programm beenden. Dann hilft nur Programm killen... :)