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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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!?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Also die Doku von der C-Funktion `getlogin()` legt die Umgebungsvariable `$LOGNAME` nahe.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Es gibt auch noch `getpass.getuser()`.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

getpass.getuser() funktioniert. Danke!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Warum brauchst du das denn? Ggf. sollte man die Wahl des Users nicht unbedingt unter den Tisch fallen lassen.
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten