Как программно получить количество пользователей, вошедших в систему на компьютере с Linux? - PullRequest
3 голосов
/ 19 ноября 2010

Мне было интересно, можно ли программно получить количество пользователей, вошедших в систему на машине с Linux в C? Я провел некоторое исследование и узнал о utmp.h, но так как не все программы используют протокол utmp, я не думал, что он будет достаточно точным. Заранее спасибо всем, кто хочет помочь.

РЕДАКТИРОВАТЬ: Я прошу прощения, ребята, что не был более конкретным, но когда я говорю, что вошли в систему пользователей, я имею в виду любой вошел в систему через оболочку. В основном то, что вы получаете, когда запускаете команду who без аргументов командной строки.

Ответы [ 8 ]

3 голосов
/ 26 ноября 2010
#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);
    }

После нескольких дней игры с utmp я понял это.Спасибо за помощь, ребята!

3 голосов
/ 19 ноября 2010

Вы нацелены на Linux и говорите, что хотите делать то, что делает who.Если ваше программное обеспечение не будет распространяться или будет лицензировано по лицензии GPL, вы можете просто извлечь из него исходную версию who, которая работает в вашей системе.

Но это вполне ограничения.Итак, как вы можете найти, с чего начать, не обращаясь к исходному коду?Вы можете получить довольно хорошее представление о том, где искать, запустив nm в двоичном файле, используя nm `which who`.who вызывает очень мало внешних функций (34 под Mac OS X 10.6.4).Функции, которые вы ищете, должны быть среди них.Вероятными кандидатами являются getutxent, utmpxname и getpwuid.Вы можете проверить справочные страницы, чтобы проверить это предположение.

Но сначала, почему бы не попробовать apropos / man -k?Быстрый поиск «пользователи» показывает утилиту users, которая просто перечисляет вошедших в систему пользователей.(Примечание. Похоже, что это BSDism, поэтому в Linux его может не быть. Быстрый поиск с помощью apropos для соответствующих инструментов и функций все еще хорошая идея.) users вызывает еще меньше внешних функций (всего 15),и из них единственная интересная, которая перекрывается интересными функциями, вызываемыми who, это getutxent.

Итак, как насчет попытки getutxent?

1 голос
/ 19 ноября 2010

Не программист на C, поэтому я не могу помочь в этой области, но вы можете заставить вашу программу выполнять команды оболочки?

who | awk -F' ' '{print $1}' | sort -u | wc -l
1 голос
/ 19 ноября 2010

utmp - твой друг.

man 5 utmp

1 голос
/ 19 ноября 2010

Системный вызов getutent гарантированно возвращает запись типа utmp независимо от внутренней реализации.Таким образом, вы можете положиться на этот API.

0 голосов
/ 19 ноября 2010

В Баш:

$ ps aux | cut -d' ' -f1 | sort -d | uniq | wc -l
0 голосов
/ 19 ноября 2010

команда оболочки linux "кто" может вам помочь.

0 голосов
/ 19 ноября 2010

Я почти уверен, что независимо от ведения журнала utmp, вы по-прежнему будете получать всю информацию о пользователе, которую вы хотите получить от этого звонка.

Какие программы вас беспокоят, которые не используют utmp logging, поскольку ваш linux может (или не может) использовать utmp logging.

И, как заметил комментатор, что вы называете «авторизованным»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...