In meinem aktuellen Projekt entwickle ich u.a. verschiedene Jython basierte Kommandozeilenanwendungen. Einige davon erwarten die Eingabe von maskierten Passwörtern. Python stellt hierfür das getpass Modul bereit. Leider ist bisher keine entsprechende Implementierung für Jython verfügbar.
Im folgenden ein passendes Modul, welches diese Funktionalität bereitstellt. Es verwendet einen Mechanismus um die Passworteingabe in der Kommandozeile zu maskieren, welcher hier beschrieben wurde //java.sun.com/developer/technicalArticles/Security/pwordmask/. Sollte Jython in Verbindung mit Java 6 oder höher eingesetzt werden, so nutzt dieses Modul stattdessen die neue Console.readPassword() Methode. Sollte das Modul in einer Umgebung laufen in welcher eine getpass Modulimplementierung verfügbar ist, dann wird stattdessen an die entsprechende Methode im getpass Modul delegiert.
# ext_getpass.py
# @author Sebastian Thomschke, //sebthom.de/
import thread, sys, time, os
# exposed methods:
__all__ = ["getpass","getuser"]
def __doMasking(stream):
__doMasking.stop = 0
while not __doMasking.stop:
stream.write("b*")
stream.flush()
time.sleep(0.01)
def generic_getpass(prompt="Password: ", stream=None):
if not stream:
stream = sys.stderr
prompt = str(prompt)
if prompt:
stream.write(prompt)
stream.flush()
thread.start_new_thread(__doMasking, (stream,))
password = raw_input()
__doMasking.stop = 1
return password
def generic_getuser():
for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'):
usr = os.environ.get(name)
if usr: return usr
def java6_getpass(prompt="Password: ", stream=None):
if not stream:
stream = sys.stderr
prompt = str(prompt)
if prompt:
stream.write(prompt)
stream.flush()
from java.lang import System
console = System.console()
if console == None:
return generic_getpass(prompt, stream)
else:
return "".join(console.readPassword())
try:
# trying to use Python's getpass implementation
import getpass
getpass = getpass.getpass
getuser = getpass.getuser
except:
getuser = generic_getuser
# trying to use Java 6's Console.readPassword() implementation
try:
from java.io import Console
getpass = java6_getpass
except ImportError, e:
# use the generic getpass implementation
getpass = generic_getpass
Here is an usage example:
import ext_getpass as getpass
pw = getpass.getpass("Please enter your password:")
print "The entered password was: " + pw
With Jython 2.5.1, I get an AttributeError on line 51. Since that block only handles the ImportError, the script was coughing-up a traceback. In my local copy, I’ve changed line 51 to read…
except (ImportError, AttributeError), e: