2012-06-12 22 views
7

Estoy tratando de encontrar la manera de solicitar una contraseña, y tienen la entrada de los usuarios resonó como asteriscos (********)¿Cómo tener la contraseña se hizo eco como asteriscos

Así recientemente, tomé en el proyecto de crear una servidor remoto al que se podría conectar utilizando el módulo de socket en Python. Todavía no está hecho, ya que estoy en el proceso de hacer que la consola se use para conectarse al servidor.

Estoy intentando hacer una ventana de inicio de sesión donde se solicita al usuario que ingrese su nombre de usuario y contraseña, aunque cuando se ingresa la contraseña busco asteriscos para imprimir, como la entrada de contraseña común (es decir, se repite Sekr3t como: * * * * * *).

Después de días de investigación, ya casi termino, todavía hay un último error que me está volviendo loco (no puedo resolverlo por completo). Nota: Sé que hay un módulo getpass que podría usarse para reemplazar esto, con mucha mayor facilidad, pero no se hizo eco de nada exactamente lo que estoy buscando.

Aquí está el código de contraseña de inicio de sesión que tengo hasta ahora, y no puedo entender por qué no hace eco asteriscos:

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 

>

Si usted lee a través del código y/o ejecutó a través algo parecido a IDLE, es posible que observe que cuando se utiliza el espacio de respaldo del usuario, un personaje borra los datos almacenados, pero no así los asteriscos impresos. es decir, Sekr3t + retroceso = Sekr3, pero * * * * * * se deja eco. Cualquier ayuda sobre cómo borrar el último asterisco cuando se ingresa el retroceso sería muy apreciada. También tenga en cuenta que gran parte de este código proviene del módulo getpass. Sé que no es una gran explicación, y probablemente no sea tan genial, pero todavía estoy aprendiendo, por favor tengan paciencia conmigo.

+3

realmente debería considerar el uso de [ 'getpass()'] (http://docs.python.org/library/getpass.html#getpass. conseguir pase). Me doy cuenta de que ya encontraste esto pero no hace eco de nada en realidad ** mejora la seguridad **. – ThiefMaster

+1

@ThiefMaster Puedo ver cómo mejoraría la seguridad, pero la aplicación es principalmente para algunos de mis amigos en una de mis redes de juegos que no son muy expertos en informática, así que estoy tratando de hacerlo en un punto intermedio seguro y fácil de usar: por eso elegí probar y hacer eco de los asteriscos en lugar de nada. –

+0

Echa un vistazo al módulo 'curses' –

Respuesta

3

Debería poder borrar un asterisco escribiendo los caracteres \x08 \x08. El \x08 moverá el cursor hacia atrás una posición, el espacio sobrescribirá el asterisco, luego el último \x08 moverá el cursor hacia atrás otra vez, colocándolo en la posición correcta para escribir el siguiente *.

No sé cómo determinar cuándo se tipea un espacio atrás, pero puede hacerlo fácilmente: simplemente agregue algo como print repr(x), luego inicie su programa y presione el botón Retroceso. .

+0

¡Gracias, funciona perfectamente! Elimina el '>' y el espacio que lo sigue (si retrocede demasiado), pero estoy planeando colocarlo en una interfaz gráfica de TKinter pronto, así que no debería ser un problema. –

+0

Me alegro de que funcione. Considere marcar mi respuesta como "aceptada" y posiblemente votando si fue especialmente útil. –

0

creo que de esta manera es muy simple y eficaz

import sys 
import msvcrt 

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

print '\n'+passwor 
Cuestiones relacionadas