mirror of https://github.com/python/cpython.git
Another new utility: getpass() prompts for a password, with echo off.
Also contains getuser(), which returns the username (not prompting though). These work on Unix and Windows!
This commit is contained in:
parent
f2da4ed48b
commit
b5903ac9fb
|
@ -0,0 +1,79 @@
|
||||||
|
"""Utilities to get a password and/or the current user name.
|
||||||
|
|
||||||
|
getpass(prompt) - prompt for a password, with echo turned off
|
||||||
|
getuser() - get the user name from the environment or password database
|
||||||
|
|
||||||
|
Authors: Piers Lauder (original)
|
||||||
|
Guido van Rossum (Windows support and cleanup)
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def getpass(prompt='Password: '):
|
||||||
|
"""Prompt for a password, with echo turned off.
|
||||||
|
|
||||||
|
Restore terminal settings at end.
|
||||||
|
|
||||||
|
On Windows, this calls win_getpass(prompt) which uses the
|
||||||
|
msvcrt module to get the same effect.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
try:
|
||||||
|
import termios, TERMIOS
|
||||||
|
except ImportError:
|
||||||
|
return win_getpass(prompt)
|
||||||
|
|
||||||
|
fd = sys.stdin.fileno()
|
||||||
|
old = termios.tcgetattr(fd) # a copy to save
|
||||||
|
new = old[:]
|
||||||
|
|
||||||
|
new[3] = new[3] & ~TERMIOS.ECHO # 3 == 'lflags'
|
||||||
|
try:
|
||||||
|
termios.tcsetattr(fd, TERMIOS.TCSADRAIN, new)
|
||||||
|
try: passwd = raw_input(prompt)
|
||||||
|
except KeyboardInterrupt: passwd = None
|
||||||
|
finally:
|
||||||
|
termios.tcsetattr(fd, TERMIOS.TCSADRAIN, old)
|
||||||
|
|
||||||
|
sys.stdout.write('\n')
|
||||||
|
return passwd
|
||||||
|
|
||||||
|
|
||||||
|
def win_getpass(prompt='Password: '):
|
||||||
|
"""Prompt for password with echo off, using Windows getch()."""
|
||||||
|
import msvcrt
|
||||||
|
for c in prompt:
|
||||||
|
msvcrt.putch(c)
|
||||||
|
pw = ""
|
||||||
|
while 1:
|
||||||
|
c = msvcrt.getch()
|
||||||
|
if c == '\r' or c == '\n':
|
||||||
|
break
|
||||||
|
if c == '\b':
|
||||||
|
pw = pw[:-1]
|
||||||
|
else:
|
||||||
|
pw = pw + c
|
||||||
|
msvcrt.putch('\r')
|
||||||
|
msvcrt.putch('\n')
|
||||||
|
return pw
|
||||||
|
|
||||||
|
|
||||||
|
def getuser():
|
||||||
|
"""Get the username from the environment or password database.
|
||||||
|
|
||||||
|
First try various environment variables, then the password
|
||||||
|
database. This works on Windows as long as USERNAME is set.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'):
|
||||||
|
user = os.environ.get(name)
|
||||||
|
if user:
|
||||||
|
return user
|
||||||
|
|
||||||
|
# If this fails, the exception will "explain" why
|
||||||
|
import pwd
|
||||||
|
return pwd.getpwuid(os.getuid())[0]
|
Loading…
Reference in New Issue