Seite 1 von 1

Passwortabfrage Python

Verfasst: Mittwoch 15. Juni 2016, 19:51
von Poirot
Hallo,
ich habe folgendes Problem: Ich habe ein E-Mail Programm in Python geschrieben und einige meiner freunde möchten dieses Programm mitbenutzen. Um E-Mail's mit Python verschicken zu können muss man E-Mail und Passwort angeben. Nun möchte ich bei der Eingabe des Passworts anstelle des Passworts ***** ausgeben. Dies ist leider ein größeres Problem als ich dachte :oops:

Ich bin über jede Hilfe froh. :D

LG Poirot

Re: Passwortabfrage Python

Verfasst: Mittwoch 15. Juni 2016, 20:20
von BlackJack
@Poirot: Schau Dir mal das `getpass`-Modul an.

Re: Passwortabfrage Python

Verfasst: Mittwoch 15. Juni 2016, 21:02
von Poirot
BlackJack hat geschrieben:@Poirot: Schau Dir mal das `getpass`-Modul an.
Diese Funktion ist nützlich für passwörter ja aber ich weiß nicht wie ich damit die eingegebenen Zeichen durch * ersetzen kann.

Falls es denoch möglich ist wäre ein Beispiel sehr hilfreich.

LG Poirot

Re: Passwortabfrage Python

Verfasst: Donnerstag 16. Juni 2016, 01:31
von Citral
Poirot hat geschrieben:
BlackJack hat geschrieben:@Poirot: Schau Dir mal das `getpass`-Modul an.
Diese Funktion ist nützlich für passwörter ja aber ich weiß nicht wie ich damit die eingegebenen Zeichen durch * ersetzen kann.

Falls es denoch möglich ist wäre ein Beispiel sehr hilfreich.

LG Poirot
Da es mich auch interessiert, habe ich mal bisschen gegoogelt.

Code: Alles auswählen

import getpass
p = getpass.getpass(prompt='Password:', stream=None)

print(p)

In pycharm bekomm ich nen Fehler zurück ist aber noch auszuführen, aber Passwort sichtbar.
GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
Password:
Per ubuntukonsole sehe ich wie Linuxtypisch kein Passwort. evt. werden in Windows Sternchen angezeigt.

Bild

Re: Passwortabfrage Python

Verfasst: Dienstag 21. Juni 2016, 12:53
von Poirot
Das ist ja schon mal ein guter Anfang @Citral. Wenn man das Programm bei Windows mit der Konsole und nicht mit IDLE ausführt wird auch anstelle der normalen Eingabe einfach nichts angegeben. Das kann allerdings verwirrend werden wenn man sich verschrieben hat und nicht weis wie viele Zeichen es sind.

War trotzdem eine große Hilfe :D

LG Poirot

Re: Passwortabfrage Python

Verfasst: Dienstag 21. Juni 2016, 19:47
von snafu
Hier wird beschrieben wie man Sterne bei der Passwortabfrage unter Windows anzeigen kann:

http://stackoverflow.com/a/16670956

Re: Passwortabfrage Python

Verfasst: Dienstag 21. Juni 2016, 20:29
von snafu
Variante, wie ich sie schreiben würde:

Code: Alles auswählen

import getpass
import sys

try:
    import msvcrt
except ImportError:
    msvcrt = None

def get_password(prompt='Password: ', stream=sys.stderr, asterisk=False):
    if not asterisk or not msvcrt:
        return getpass.getpass(prompt, stream)
    stream.write(prompt)
    stream.flush()
    password = []
    while True:
        character = msvcrt.getwch()
        if character == '\003':
            raise KeyboardInterrupt
        elif character in ('\r', '\n'):
            stream.write('\r\n')
            break
        elif character == '\b' and password:
            password.pop()
            stream.write('\b \b')
        else:
            password.append(character)
            stream.write('*')
        stream.flush()
    return ''.join(password)
Wobei hier der asterisk-Parameter nur unter Windows beachtet wird.

Re: Passwortabfrage Python

Verfasst: Mittwoch 22. Juni 2016, 19:37
von Poirot
snafu hat geschrieben:Variante, wie ich sie schreiben würde:

Code: Alles auswählen

import getpass
import sys

try:
    import msvcrt
except ImportError:
    msvcrt = None

def get_password(prompt='Password: ', stream=sys.stderr, asterisk=False):
    if not asterisk or not msvcrt:
        return getpass.getpass(prompt, stream)
    stream.write(prompt)
    stream.flush()
    password = []
    while True:
        character = msvcrt.getwch()
        if character == '\003':
            raise KeyboardInterrupt
        elif character in ('\r', '\n'):
            stream.write('\r\n')
            break
        elif character == '\b' and password:
            password.pop()
            stream.write('\b \b')
        else:
            password.append(character)
            stream.write('*')
        stream.flush()
    return ''.join(password)
Wobei hier der asterisk-Parameter nur unter Windows beachtet wird.
Ich muss ganz ehrlich sagen das ich aus diesem Code nicht schlau werde :K. Bin noch Programmier Anfänger bzw behersche die Grundkenntnisse das hier ist mir leider viel zu hoch :(

Wenn du es evt. erklären könntest wäre mir sehr weitergeholfen :)

Re: Passwortabfrage Python

Verfasst: Mittwoch 22. Juni 2016, 20:40
von BlackJack
@Poirot: Wo liegt denn das Problem beim Verständnis? Da wird nichts wirklich exotisches verwendet, und was verwendet wird sollte man alles nachlesen können, wenn man es nicht versteht.

Re: Passwortabfrage Python

Verfasst: Mittwoch 22. Juni 2016, 20:54
von DasIch
Poirot hat geschrieben:Ich muss ganz ehrlich sagen das ich aus diesem Code nicht schlau werde :K. Bin noch Programmier Anfänger bzw beherrsche die Grundkenntnisse das hier ist mir leider viel zu hoch :(
Du magst den Code nicht verstehen aber mit deinen Grundkenntnissen dürftest es nicht schon an der ersten Zeile scheitern. Geh Zeile für Zeile den Code durch und sobald du auf eine stößt die du nicht verstehst, frag was da passiert. Darauf kann man dann auch sinnvoll und effizient antworten.

Re: Passwortabfrage Python

Verfasst: Freitag 24. Juni 2016, 08:49
von Kebap
snafu hat geschrieben:Variante, wie ich sie schreiben würde
Wobei hier der asterisk-Parameter nur unter Windows beachtet wird.
Anscheinend ist auch das msvcrt Modul nur Windows/DOS only - beim Rest wird deine Variante normal getpass benutzen. Schön!

Wieso ist asterisk default False?

Re: Passwortabfrage Python

Verfasst: Freitag 24. Juni 2016, 11:05
von snafu
Kebap hat geschrieben:Anscheinend ist auch das msvcrt Modul nur Windows/DOS only - beim Rest wird deine Variante normal getpass benutzen.
Richtig, es handelt sich dabei um eine reine Windows-Schnittstelle. Daher ist ja auch die Sonderbehandlung nötig, denn der Code für Unix-Terminals funktioniert unter Windows nicht.
Kebap hat geschrieben:Wieso ist asterisk default False?
Ich wollte mit dem Standardverhalten nahe am Python-eigenen getpass() sein.