perl: Passworteingabe mit '*'-Echo

Xanti

Xanti

Mouse Organist
Hallo,

eine Anfrage hier im Forum bezüglich Passworteingabe mit *-Ausgabe für jeden Buchstaben (siehe hier)
hat mich auf die Idee gebracht, dies mal unter perl zu probieren. Folgendes hab ich bis jetzt:

Code:
#!/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
 
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
 
Hallo Wolfgang,

hat leider keine Änderung gebracht.

Gruss, Phorus
 
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
 
Zuletzt bearbeitet:
Klasse, das wars. Mit 'raw' gehts. Danke Wolfgang.

edit: der Vollständigkeit halber hier mein funktionierender Code

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.
 
Zuletzt bearbeitet:
Phorus schrieb:
Klasse, das wars. Mit 'raw' gehts. Danke Wolfgang.

edit: der Vollständigkeit halber hier mein funktionierender Code

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.
Code:
...
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
 
Wolfgang_1 schrieb:
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:
Code:
last if ($key eq "\n");

sollte

Code:
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:

Code:
while (1) {
  $passphrase .= (ReadKey 0);
  last if ($passphrase =~ /\n/);
  print '*';		
}
chop $key;
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
Wolfgang_1 schrieb:
...
Ich werde langsam zu alt dafür. ;)

Quatsch, warst 'ne grosse Hilfe.

edit:

Wolfgang_1 schrieb:
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... :)
 
Zuletzt bearbeitet:

Ähnliche Themen

CGI laesst sich nicht ausfuehren

Zurück
Oben