761 Stimmen

Gibt es einen tragbaren Weg, um den aktuellen Benutzernamen in Python zu erhalten?

Was ist ein plattformübergreifender Weg (z. B. für Linux und Windows), um den Benutzernamen des aktuellen Benutzers zu erhalten? Etwas ähnliches wie os.getuid() wäre schön:

>>> os.getuid()
42

# Existiert derzeit nicht in Python
>>> os.getusername()
'slartibartfast'

Das pwd Modul funktioniert nur für Unix. Einige Leute meinen, dass das Abrufen des Benutzernamens unter Windows in bestimmten Situationen kompliziert sein kann (z. B. bei der Ausführung als Windows-Dienst).

0 Stimmen

Es funktioniert nicht auf meinem Linux-Rechner!

6 Stimmen

import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos oder import pwd, os; print pwd.getpwuid(os.getuid()).pw_name

0 Stimmen

Getusername() ist keine gültige Methode im os Python-Modul: docs.python.org/2.7/library/os.html

1066voto

Konstantin Tenzin Punkte 11704

Schauen Sie sich das getpass Modul an

import getpass
getpass.getuser()
'kostya'

Verfügbarkeit: Unix, Windows


p.s. Gemäß Kommentar unten "Diese Funktion betrachtet die Werte verschiedener Umgebungsvariablen, um den Benutzernamen zu bestimmen. Daher sollte man sich nicht auf diese Funktion für Zugriffskontrollzwecke verlassen (oder möglicherweise für jeden anderen Zweck, da sie es jedem Benutzer erlaubt, sich als jeden anderen auszugeben)."

40 Stimmen

Es ist nichts falsch mit getpass.getuser(), da es nicht behauptet, den Benutzer zu authentifizieren. Der Zweck der Funktion besteht darin festzustellen, wer der Benutzer zu sein behauptet, ohne den Benutzer direkt zu fragen.

9 Stimmen

Das funktioniert nicht, wenn du bereits su gemacht hast. $ echo $USER hithwen $ su julia Passwort: $ echo $USER julia $ python >>> import getpass >>> getpass.getuser() 'hithwen'

8 Stimmen

@GregHewgill bringt einen sehr guten Punkt, aber tatsächlich hat es einige Anwendungen, den Benutzernamen auf einfache Weise ohne Authentifizierung herauszufinden. Mein aktueller Anwendungsfall: Markierung einiger gemeinsam genutzter Testressourcen mit einem Benutzernamen für eine spätere einfache Bereinigung. (So ist es einfacher herauszufinden, wessen Durcheinander wessen ist.)

169voto

Liam Chasteen Punkte 1687

Kombinieren Sie os.getuid() mit pwd.getpwuid():

import os
import pwd

def get_username():
    return pwd.getpwuid(os.getuid())[0]

Sehen Sie sich die pwd Dokumentation für weitere Details an.

79 Stimmen

Alternativ (etwas angenehmer zu lesen): pwd.getpwuid(os.getuid()).pw_name.

8 Stimmen

Was tut es unter Windows? Vielleicht könnte man das ausprobieren und falls es scheitert, auf die schlechten 'getpass/env var'-Methoden zurückgreifen.

2 Stimmen

Dies ist der richtige Weg, wenn Sie den Benutzernamen sowohl mit als auch ohne Anmeldung erhalten müssen.

130voto

Marcin Augustyniak Punkte 1231

Sie können auch verwenden:

os.getlogin()

41 Stimmen

Auf Linux gibt die Funktion getlogin() den Namen des "angemeldeten Benutzers auf dem steuernden Terminal des Prozesses" zurück. Sie versagt daher, wenn kein steuerndes Terminal vorhanden ist, z.B. in einer Mod_Python-Anwendung.

8 Stimmen

Wenn Sie su verwendet haben, wird dies nicht den aktuellen Benutzer zurückgeben, sondern den ursprünglich angemeldeten Benutzer.

5 Stimmen

Funktioniert auf Windows... Python 3.4.1 (v3.4.1:c0e311e010fc, 18. Mai 2014, 10:38:22) [MSC v.1600 32 Bit (Intel)] auf win32 Geben Sie "help", "copyright", "credits" oder "license" für mehr Information ein. >>> import os; os.getlogin() 'jrb'

110voto

Nadia Alramli Punkte 105256

Windows:

os.environ.get('USERNAME')

Linux:

os.environ.get('USER')

Both:

os.environ.get('USER', os.environ.get('USERNAME'))

Note that environment variables can be modified by the user, so this is a potential security vulnerability. With this method, an attacker can easily fake their username.

Translated to German:

Windows:

os.environ.get('USERNAME')

Linux:

os.environ.get('USER')

Beide:

os.environ.get('USER', os.environ.get('USERNAME'))

Beachten Sie, dass Umgebungsvariablen vom Benutzer geändert werden können, daher handelt es sich um eine potenzielle Sicherheitslücke. Mit dieser Methode kann ein Angreifer leicht seinen Benutzernamen fälschen.

27 Stimmen

os.getenv(...) ist veraltet zugunsten von os.environ[...].

12 Stimmen

Sollte es nicht BENUTZER anstelle von BENUTZERNAME sein?

10 Stimmen

@MikeGraham os.getenv scheint nicht veraltet zu sein..?

25voto

Adam Punkte 338

Diese könnten funktionieren. Ich weiß nicht, wie sie sich beim Ausführen als Dienst verhalten. Sie sind nicht portabel, aber dafür sind os.name und if -Anweisungen da.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

Siehe: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

38 Stimmen

Diese Antwort ist mindestens genauso nützlich wie die (nutzlose) mit 25 Stimmen bewertete Unix-only-Antwort.

5 Stimmen

>"Mindestens genauso nützlich" Abgemacht. Vermutlich ist die richtige Antwort eine Kombination aus beiden.

1 Stimmen

Wenn Sie auf Python 2 unter Windows stecken, ist dies der einzige sichere Weg, dies zu tun. Alle anderen Möglichkeiten können getrickst werden, indem SET USERNAME=FAKE vor Ihrem Python-Befehl ausgeführt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X