Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > информация о пользователях linux


Автор: boostcoder 25.10.2010, 00:26
всем привет.

два вопроса:
1. как получить список всех пользователей?
2. как определить продолжительность текущего сеанса пользователя?

спасибо.


зы
по поводу 1: можно прочесть имена каталогов в /home. еще вариант, парсить /etc/passwd и из него извлечь имена пользователей. но что-то мне оба таких варианта кажутся нелепыми)
по поводу 2го вообще мыслей нет.


Автор: xvr 25.10.2010, 11:31
Цитата(boostcoder @ 25.10.2010,  00:26)
два вопроса:
1. как получить список всех пользователей?

Совсем всех или залогиненных? Если первое, то парсинг passwd вполне нормально (точнее парсинг ypcat passwd), если второе - то парсинг вывода от ps (на имена пользователей)
Цитата

2. как определить продолжительность текущего сеанса пользователя?
Найти время старта корневого шела пользователя (из вывода ps)

Автор: boostcoder 25.10.2010, 11:35
Цитата(xvr @  25.10.2010,  11:31 Найти цитируемый пост)
Совсем всех или залогиненных?

всех.

Цитата(xvr @  25.10.2010,  11:31 Найти цитируемый пост)
(точнее парсинг ypcat passwd)

ман про "ypcat" не знает. поясните..

Цитата(xvr @  25.10.2010,  11:31 Найти цитируемый пост)
Найти время старта корневого шела пользователя (из вывода ps)

а как это в ps должно выглядеть? точнее что именно мне нужно от ps?

Автор: djamshud 25.10.2010, 11:43
По поводу первого - хз. Пассвд и хом парсить нелепо. Домашние директории могут храниться где угодно, а авторизация происходить через LDAP - насколько я понимаю, в таком случае /etc/passwd вообще не будет, поправьте, если я не прав.

По поводу второго - w, who.

Добавлено через 1 минуту и 7 секунд
А в первом наверное может помочь pam... 

Автор: xvr 25.10.2010, 11:54
Цитата(boostcoder @ 25.10.2010,  11:35)
Цитата(xvr @  25.10.2010,  11:31 Найти цитируемый пост)
(точнее парсинг ypcat passwd)

ман про "ypcat" не знает. поясните..

У меня знает:
Цитата

NAME
       ypcat - print values of all keys in a NIS database
 
SYNOPSYS
       ypcat [ -kt ] [ -d domain ] [ -h hostname ] mapname
       ypcat -x
 
DESCRIPTION
       ypcat  prints the values of all keys from the NIS database specified by mapname, which may be a map
       name or a map nickname.
дело в том, что если ваша машина включена в сеть, то /etc/passwd может быть вообще пустым

Цитата

Цитата(xvr @  25.10.2010,  11:31 Найти цитируемый пост)
Найти время старта корневого шела пользователя (из вывода ps)

а как это в ps должно выглядеть? точнее что именно мне нужно от ps?

Как то так:
Код

ps --ppid 1 -o "user,stime"


Или who - как правильно заметил djamshud

PS. Специально проверил - who и w дампуют не всех  smile 

Автор: MAKCim 25.10.2010, 12:22
нативный способ - читать /var/run/utmp (man utmp)

Добавлено через 12 минут и 6 секунд
Код

#include <utmp.h>

#include <stdio.h>

int main()
{
    FILE *fp;
    int error;
    struct utmp utmp;
    if ((fp = fopen("/var/run/utmp", "r")) == NULL)
    {
        return -1;
    }
    for (; fread(&utmp, sizeof(utmp), 1, fp) == 1; )
    {
        printf("%hd:%u:%s:%s:%s:%s:(%hd:%hd):%ld:(%lu:%lu)\n",
            utmp.ut_type,
            utmp.ut_pid,
            utmp.ut_line,
            utmp.ut_id,
            utmp.ut_user,
            utmp.ut_host,
            utmp.ut_exit.e_termination,
            utmp.ut_exit.e_exit,
            utmp.ut_session,
            utmp.ut_tv.tv_sec,
            utmp.ut_tv.tv_usec
            );
    }
    if (ferror(fp))
    {
        error = -2;
    }
    else
    {
        error = 0;
    }
    fclose(fp);
    return error;
}


Автор: MAKCim 25.10.2010, 12:41
соответственно задача 2 решается
нахождением max(curr_time - ut_tv.tv_sec) по каждому элементу utmp для нужного юзера

Автор: boostcoder 25.10.2010, 12:43
MAKCim, спасибо за пример.
я так понял, что этот код, предоставит информацию об активных пользователях? или о всех?

Автор: MAKCim 25.10.2010, 13:35
boostcoder
задача 2 справедлива только для активных (залогиненых) вроде как...
для 1 тупо как уже сказали пропарсить /etc/passwd

Автор: boostcoder 25.10.2010, 15:11
всем спасибо.
вопрос закрыт.

Автор: xvr 25.10.2010, 18:50
Цитата(MAKCim @  25.10.2010,  12:22 Найти цитируемый пост)
нативный способ - читать /var/run/utmp
Собственно w и who это и делают. Но некоторых он все же не показывает, вот например:
Код

0 S xxxxxxxx 16626     1  0  75   0 - 20145 -      Oct21 ?        00:00:00 nedit -server
В списке от who его нет




Автор: MAKCim 25.10.2010, 23:13
Цитата(xvr @  25.10.2010,  18:50 Найти цитируемый пост)
Собственно w и who это и делают. 

заниматься парсингом вывода конкретной программы дело неблагодарное и неправильное ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)