2012-06-12 21 views
7

Sto cercando di capire come richiedere una password, e hanno l'ingresso degli utenti eco indietro come asterischi (********)Come avere la password eco come asterischi

Così di recente, ho preso il progetto di creazione di un server remoto che potrebbe essere connesso all'utilizzo del modulo socket in Python. Non è ancora stato fatto, dato che sono in procinto di rendere la console utilizzata per connettersi al server.

Sto provando a creare una finestra di accesso in cui viene richiesto all'utente di immettere il nome utente e la password, anche se quando viene immessa la password cerco asterischi da stampare, ad esempio l'immissione di una password comune (ad esempio: Sekr3t è echo'd come: * * * * * *).

Dopo giorni di ricerche su di esso, ho quasi finito, ma c'è ancora un ultimo errore che mi sta facendo impazzire (non sono completamente in grado di risolverlo). Nota - So che c'è un modulo getpass che potrebbe essere usato per rimpiazzarlo, con molta più facilità, ma nulla di echo non è esattamente quello che sto cercando.

Ecco il codice di password di accesso che ho finora, e io non riesco a capire il motivo per cui non eco asterischi:

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 

>

Se avete letto attraverso il codice e/o eseguito attraverso qualcosa come IDLE, si potrebbe notare che quando l'utente back-space è, i dati memorizzati vengono cancellati da un carattere, ma gli asterischi stampati non lo sono. vale a dire - Sekr3t + backspace = Sekr3, tuttavia * * * * * * è lasciato echo'd. Sarebbe molto gradito qualsiasi aiuto su come cancellare l'ultimo asterisco quando viene inserito backspace. Inoltre, un sacco di questo codice proviene dal modulo getpass. So che non è una gran bella spiegazione, e probabilmente non è un granché di codice, ma sto ancora imparando - per favore portami dietro.

+3

Si dovrebbe considerare l'utilizzo di [ 'getpass()'] (http://docs.python.org/library/getpass.html#getpass. getpass). Mi rendo conto che hai già trovato questo, ma non riecheggiare nulla in realtà ** migliora la sicurezza **. – ThiefMaster

+1

@ThiefMaster Riesco a vedere come migliorerebbe la sicurezza, ma l'applicazione è principalmente per alcuni dei miei amici in una delle mie reti di gioco che non sono molto abituate al computer, quindi sto provando a farlo da qualche parte tra e user-friendly - è per questo che ho scelto di provare a fare eco gli asterischi anziché nulla. –

+0

Controlla il modulo 'curses' –

risposta

3

Dovresti riuscire a cancellare un asterisco scrivendo i caratteri \x08 \x08. Lo \x08 sposterà il cursore indietro di una posizione, lo spazio sovrascriverà l'asterisco, quindi l'ultimo \x08 sposterà di nuovo il cursore indietro, mettendolo nella posizione corretta per scrivere il successivo *.

Non so fuori dalla parte superiore della mia testa come determinare quando un backspace viene digitato, ma si può fare facilmente: basta aggiungere qualcosa di simile print repr(x) dopo aver chiamato x = msvcrt.getch(), quindi avviare il programma e ha colpito backspace .

+0

Grazie, funziona perfettamente! Rimuove il '>' e lo spazio dopo di esso (se lo spazio di back-back è troppo lontano), ma sto pianificando di metterlo in un guesto di TKinter a breve, quindi non dovrebbe essere un problema. –

+0

Felice che funzioni. Per favore considera di contrassegnare la mia risposta come "accettata" e, se possibile, di svalutarla se fosse particolarmente utile. –

0

penso in questo modo è molto semplice ed efficace

import sys 
import msvcrt 

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

print '\n'+passwor 
Problemi correlati