Seite 1 von 1

os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Mittwoch 12. Mai 2010, 17:22
von jens
Bekomme bei "os.getlogin()" ein "[Errno 22] Invalid argument" :K

Wie kann das sein?

System: 2.6.26-2-xen-amd64, Python v2.5.2

EDIT: Das ganze funktioniert auf Konsole, aber nicht in der web Anwendung auf dem selben Server...

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Mittwoch 12. Mai 2010, 17:35
von BlackJack
@jens: Vielleicht hat der Webserver beziehungsweise der Benutzer unter dem das läuft nicht die nötigen Rechte auf /var/run/utmp zuzugreifen? Oder er hat sich gar nicht "eingeloggt", sprich er hat gar kein (Pseudo)Terminal zugeordnet!?

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Mittwoch 12. Mai 2010, 17:47
von jens
Das zweite würde IMHO Sinn machen...

Wie kann ich noch an den User Namen kommen? hab die pid und auch die uid.

EDIT: Wobei os.ctermid() == "/dev/tty" ist.

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Mittwoch 12. Mai 2010, 20:53
von BlackJack
Also die Doku von der C-Funktion `getlogin()` legt die Umgebungsvariable `$LOGNAME` nahe.

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Mittwoch 12. Mai 2010, 21:00
von Trundle
Es gibt auch noch `getpass.getuser()`.

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Donnerstag 13. Mai 2010, 08:12
von jens
getpass.getuser() funktioniert. Danke!

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Donnerstag 13. Mai 2010, 08:18
von BlackJack
So sieht die Implementierung davon übrigens aus:

Code: Alles auswählen

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]

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Freitag 14. Mai 2010, 07:58
von jens
Hm. Ob es nicht eigentlich klüger wäre direkt den Usernamen mit pwd.getpwuid(os.getuid())[0] zu ermitteln? Überlegung dahinter: Die Environment Variablen kann man recht einfach manipulieren...

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Freitag 14. Mai 2010, 10:24
von cofi
Warum brauchst du das denn? Ggf. sollte man die Wahl des Users nicht unbedingt unter den Tisch fallen lassen.

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Freitag 14. Mai 2010, 10:32
von BlackJack
@jens: Was zum Beispiel ein Vorteil davon sein kann. Die Frage ist, wer kann das wo manipulieren und ist das ein Problem. Die Umgebungsvariable der laufenden Web-Anwendung wird man von aussen ja zum Beispiel nicht so einfach ändern können.

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Freitag 14. Mai 2010, 11:12
von jens
Das ganze ist nicht's kritisches.

Ich brauche den Usernamen für: http://github.com/jedie/PyLucid-system- ... ion-plugin

Er wird für subprocess verwendet:

Code: Alles auswählen

cmd = ["/usr/bin/top", "-bn1", "-U%s" % username]

Re: os.getlogin() -> [Errno 22] Invalid argument

Verfasst: Freitag 14. Mai 2010, 12:14
von Leonidas
Und wo ist das Problem, wenn es manipuliert wird? Deine Lösung kann man übrigens auch manipulieren, wenn man mit LD_PRELOAD eine andere libc einbindet.