2010-11-18 13 views
3

Ich frage mich, ob es möglich war, die Anzahl der Benutzer auf einem Linux-Rechner in C programmgesteuert zu erhalten? Ich habe etwas recherchiert und etwas über utmp.h herausgefunden, aber da nicht alle Programme utmp Logging verwenden, dachte ich nicht, dass es genau genug wäre. Vielen Dank im Voraus an alle, die bereit sind zu helfen.Wie programmgesteuert erhalten Sie die Anzahl der Benutzer, die auf einem Linux-Computer angemeldet sind?

EDIT: Ich entschuldige mich Jungs für nicht konkreter sein, aber wenn ich sagen, eingeloggte Benutzer, ich verweise auf alle über Shell angemeldet. Im Grunde, was Sie erhalten, wenn Sie den Befehl who ohne Befehlszeilenargumente ausführen.

+2

Werden 'ftp' Benutzer als" eingeloggt "betrachtet? Wie wäre es mit HTML-Sitzungen auf dem Webserver? Definieren Sie, was Sie für "eingeloggt" halten, da "utmp" nicht gut für Sie ist. Wenn es sich um Shells handelt, sollten Sie nach Login-Shells suchen (z. B. '-bash' anstelle von' bash'). – mpez0

Antwort

3
#include <utmp.h> 
#include <err.h> 

#define NAME_WIDTH 8 

    FILE *ufp; 
    int numberOfUsers = 0; 
    struct utmp usr; 
    ufp = file(_PATH_UTMP); 
    while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1) { 
    if (*usr.ut_name && *usr.ut_line && *usr.ut_line != '~') { 
     numberOfUsers++; 
     } 
    } 

    FILE *file(char *name) 
    { 
     FILE *ufp; 

     if (!(ufp = fopen(name, "r"))) { 
      err(1, "%s", name); 
     } 
     return(ufp); 
    } 

Nach ein paar Tagen das Spiel mit utmp, dachte ich es aus. Danke für die Hilfe Jungs.

+0

Kannst du mir sagen, wie man die Benutzeranzahl abmeldet? Ich möchte nur die letzte Anmeldezeit aller Benutzer erhalten. Danke im Voraus :) –

0

Ich bin mir ziemlich sicher, dass Sie trotz der utmp-Protokollierung immer noch alle Benutzerinformationen haben, die Sie von diesem Anruf wünschen.

Für welche Programme Sie sich sorgen, verwenden Sie nicht das Protokoll utmp, da Ihr Linux möglicherweise die Protokollierung von utmp verwendet (oder auch nicht).

Und, wie ein Kommentator bemerkt, was nennen Sie "eingeloggt"?

1

Der Systemaufruf getutent gibt garantiert einen utmp-ähnlichen Datensatz unabhängig von der internen Implementierung zurück. So können Sie sich auf diese API verlassen.

1

utmp ist dein Freund.

man 5 utmp

3

Sie Linux-Targeting, und Sie sagen, Sie tun wollen, was who tut. Wenn Ihre Software nicht vertrieben wird oder GPL lizenziert ist, können Sie die Open-Source-Implementierung von who, die auf Ihrem System ausgeführt wird, einfach kritisieren.

Aber das sind ziemlich die Einschränkungen. Wie können Sie herausfinden, wo Sie anfangen sollen, ohne den Quellcode zu konsultieren? Sie können eine ziemlich gute Vorstellung davon bekommen, wo Sie suchen müssen, indem Sie nm auf der Binärdatei mit nm `which who` ausführen. who ruft sehr wenige externe Funktionen auf (34 unter Mac OS X 10.6.4). Die Funktionen, die Sie suchen, müssen unter diesen sein. Wahrscheinliche Kandidaten sind getutxent, utmpxname und getpwuid. Sie können die Manpages überprüfen, um diese Schätzung zu bestätigen.

Aber zuerst, warum nicht versuchen apropos/man -k? Eine schnelle Suche nach "Benutzern" zeigt das Dienstprogramm users, das nur die angemeldeten Benutzer auflistet. (Hinweis: Dies scheint ein BSDism zu sein, so dass Sie es unter Linux nicht haben. Schnelle Suchen mit apropos für relevante Tools und Funktionen sind immer noch eine gute Idee.) users ruft noch weniger externe Funktionen (nur 15), und von denen, der einzige interessante, der sich mit den interessanten Funktionen überschneidet, die von who aufgerufen werden, ist getutxent.

Also, wie wäre es mit dem Versuch getutxent?

+0

"Sie zielen auf Linux, und Sie sagen, dass Sie tun wollen, was sie tun." Nicht genau während wer einige nützliche Informationen zur Verfügung stellt, interessiert mich nur die Anzahl der eingeloggten Benutzer. – Error1f1f

+0

@ Error1f1f Aber Sie können diese Information aus der Information ableiten, die 'wer' liefert, also' wer' exemplifiziert, Ihre Hände auf den zu bekommen Informationen benötigt. Wenn Sie tun können, was "wer" tut, können Sie tun, was Sie tun möchten, wie durch die Shell-Pipeline von @Alison R demonstriert, die die Benutzernamen abruft, sie uniques macht und die eindeutigen Ergebnisse zählt. –

+0

Auch "strace wer". –

1

Kein C-Programmierer, also kann ich nicht in dieser Arena helfen, aber können Sie Ihr Programm Shell-Befehle ausführen lassen?

who | awk -F' ' '{print $1}' | sort -u | wc -l 
+0

Nein Ich kann mein Programm Shell-Befehle nicht ausführen lassen, aber das hat das gewünschte Ergebnis erzeugt. – Error1f1f

-1

Linux Shell-Befehl "wer" vielleicht Ihnen helfen.

0

In bash:

$ ps aux | cut -d' ' -f1 | sort -d | uniq | wc -l 
Verwandte Themen