2012-06-12 4 views
7

ich herauszufinden versuche, wie ein Kennwort zu veranlassen, und haben die Benutzer Eingang Echo zurück als Sternchen (********)Wie haben Passwort hallte als Sternchen

Also vor kurzem habe ich auf das Projekt übernahm eine der Schaffung Remote-Server, der mit dem Socket-Modul in Python verbunden werden könnte. Es ist noch nicht fertig, da ich gerade dabei bin, die Konsole zur Verbindung mit dem Server zu benutzen.

Ich versuche ein Login-Fenster zu erstellen, in dem ein Benutzer aufgefordert wird, seinen Benutzernamen und sein Passwort einzugeben. Wenn das Passwort eingegeben wird, suche ich nach Sternchen, wie zB Passworteingabe (zB - Sekr3t wird echo wie: * * * * * *).

Nach Tagen der Forschung ist ich fast fertig, aber es gibt immer noch einen letzten Fehler, der mich verrückt macht (ich bin völlig unfähig, es zu lösen). Hinweis - Ich weiß, dass es ein getpass-Modul gibt, mit dem man dies leichter ersetzen könnte, aber nichts Echo ist nicht genau das, wonach ich suche.

Hier ist das Passwort Login-Code ich so weit, und ich kann nicht herausfinden, warum es Sternchen nicht echo:

import msvcrt 
import sys 

def login(prompt = '> '): 
    write = sys.stdout.write 

    for x in prompt: 
     msvcrt.putch(x) 
    passw = "" 

    while 1: 
     x = msvcrt.getch() 
     if x == '\r' or x == '\n': 
      break 
     if x == '\b': 
      # position of my error 
      passw = passw[:-1] 
     else: 
      write('*') 
      passw = passw + x 
    msvcrt.putch('\r') 
    msvcrt.putch('\n') 
    return passw 

>

Wenn Sie den Code lesen und/oder lief es durch etwas wie IDLE, Sie könnten feststellen, dass wenn die Benutzer-Back-Space's, die gespeicherten Daten um ein Zeichen gelöscht werden, aber die Sterne gedruckt nicht sind. h. - Sekr3t + Rückschritt = Sekr3, doch * * * * * * wird als Echo zurückgelassen. Jede Hilfe, wie man das letzte Sternchen löscht, wenn Backspace eingegeben wird, würde sehr geschätzt werden. Beachten Sie auch, dass ein Großteil dieses Codes vom getpass-Modul stammt. Ich weiß, dass es keine großartige Erklärung ist und wahrscheinlich nicht so toll, aber ich lerne immer noch - bitte, ertragen Sie mit mir.

+3

Sie wirklich in Betracht ziehen sollte mit [ 'getpass()'] (http://docs.python.org/library/getpass.html#getpass. getpass). Ich merke, dass du das schon gefunden hast, aber nichts widerspiegelt ** verbessert die Sicherheit **. – ThiefMaster

+1

@ThiefMaster Ich kann sehen, wie es die Sicherheit verbessern würde, aber die Anwendung ist hauptsächlich für einige meiner Freunde in einem meiner Gaming-Netzwerke, die nicht sehr Computer-geschickt sind, also versuche ich es irgendwo dazwischen sicher zu machen und benutzerfreundlich - deshalb entschied ich mich zu versuchen, Sternchen im Gegensatz zu nichts zu haben. –

+0

Schauen Sie sich das Modul 'curses' an –

Antwort

3

Sie sollten einen Stern löschen können, indem Sie die Zeichen \x08 \x08 schreiben. Der \x08 wird den Cursor um eine Position zurückbewegen, der Speicherplatz wird den Stern überschreiben, dann wird der letzte \x08 den Cursor wieder zurück bewegen und ihn in die richtige Position bringen, um den nächsten * zu schreiben.

Ich weiß nicht, die Spitze von meinem Kopf ab, wie zu bestimmen, wann ein Backspace eingegeben wird, aber Sie können das leicht tun: nur so etwas wie print repr(x) hinzufügen, nachdem Sie x = msvcrt.getch() genannt haben, dann starten Sie Ihr Programm und Backspace Hit .

+0

Danke, es funktioniert absolut perfekt! Es entfernt das '>' und das Leerzeichen danach (wenn du zu weit zurück platzierst), aber ich plane, das bald in eine TKinter-GUI zu legen, also sollte das kein Problem sein. –

+0

Froh, dass es funktioniert. Bitte beachte, dass du meine Antwort als "akzeptiert" markierst und sie möglicherweise aufhebst, wenn sie besonders hilfreich war. –

0

denke ich, auf diese Weise sehr einfach und effektiv

import sys 
import msvcrt 

passwor = '' 
while True: 
    x = msvcrt.getch() 
    if x == '\r': 
     break 
    sys.stdout.write('*') 
    passwor +=x 

print '\n'+passwor 
Verwandte Themen