Читаем Linux API. Исчерпывающее руководство полностью

Листинг 40.3. Обновление файлов utmp и wtmp

loginacct/utmpx_login.c

#define _GNU_SOURCE

#include

#include

#include  /* Определения _PATH_UTMP и _PATH_WTMP */

#include "tlpi_hdr.h"


int

main(int argc, char *argv[])

{

struct utmpx ut;

char *devName;


if (argc < 2 || strcmp(argv[1], "-help") == 0)

usageErr("%s username [sleep-time]\n", argv[0]);


/* Инициализируем запись входа в систему для файлов utmp и wtmp */


memset(&ut, 0, sizeof(struct utmpx));

ut.ut_type = USER_PROCESS; /* Это запись о входе в систему */

strncpy(ut.ut_user, argv[1], sizeof(ut.ut_user));

if (time((time_t *) &ut.ut_tv.tv_sec) == -1)

errExit("time"); /* Указываем текущее время */

ut.ut_pid = getpid();

/* Устанавливаем поля ut_line и ut_id на основе того, какой терминал связан

со стандартным вводом. Мы исходим из того, что имена терминалов имеют вид

"/dev/[pt]t[sy]*". Имя каталога "/dev/" занимает пять символов; префикс

"[pt]t[sy]" — три символа (в итоге получается восемь символов). */


devName = ttyname(STDIN_FILENO);

if (devName == NULL)

errExit("ttyname");

if (strlen(devName) <= 8) /* Это условие не должно выполняться */

fatal("Terminal name is too short: %s", devName);


strncpy(ut.ut_line, devName + 5, sizeof(ut.ut_line));

strncpy(ut.ut_id, devName + 8, sizeof(ut.ut_id));


printf("Creating login entries in utmp and wtmp\n");

printf(" using pid %ld, line %.*s, id %.*s\n",

(long) ut.ut_pid, (int) sizeof(ut.ut_line), ut.ut_line,

(int) sizeof(ut.ut_id), ut.ut_id);


setutxent(); /* Переходим в начало файла utmp */

if (pututxline(&ut) == NULL) /* Добавляем в файл utmp запись о входе в систему */

errExit("pututxline");

updwtmpx(_PATH_WTMP, &ut); /* Добавляем запись о входе в систему в файл wtmp */


/* Засыпаем, давая пользователю возможность просмотреть файлы utmp и wtmp */


sleep((argc > 2)? getInt(argv[2], GN_NONNEG, "sleep-time"): 15);


/* Теперь "выходим из системы"; используем значения из ранее

инициализированной структуры 'ut', меняя их следующим образом: */


ut.ut_type = DEAD_PROCESS; /* Нужно для записи данных о выходе из системы */

time((time_t *) &ut.ut_tv.tv_sec); /* Указываем время выхода */

memset(&ut.ut_user, 0, sizeof(ut.ut_user));

/* Имя пользователя в записи о выходе равно NULL */

printf("Creating logout entries in utmp and wtmp\n");

setutxent(); /* Переходим в начало файла utmp */

if (pututxline(&ut) == NULL) /* Заменяем ранее созданную в utmp запись */

errExit("pututxline");

updwtmpx(_PATH_WTMP, &ut); /* Добавляем запись о выходе в файл wtmp */


endutxent();

exit(EXIT_SUCCESS);

}

loginacct/utmpx_login.c


40.7. Файл lastlog


Этот файл хранит информацию о времени последнего входа в систему каждого пользователя (в отличие от файла wtmp, в котором находятся данные обо всех входах и выходах из системы). В числе прочего файл lastlog позволяет программе login информировать пользователей о том, когда они в последний раз входили в систему (в начале новой сессии). Данный файл должен обновляться приложениями, отвечающими за вход в систему (наряду с utmp и wtmp).

Как и в случае с файлами utmp и wtmp, местоположение и формат lastlog могут варьироваться (а в ряде UNIX-систем он и вовсе отсутствует). В Linux этот файл имеет путь /var/log/lastlog, на который указывает константа _PATH_LASTLOG, объявленная в заголовочном файле . Файл lastlog (по аналогии с utmp и wtmp) обычно защищен от записи со стороны пользователей, не имеющих соответствующих привилегий.

Записи в файле lastlog имеют следующий формат (описанный в ):

#define UT_NAMESIZE 32

#define UT_HOSTSIZE 256


struct lastlog {

time_t ll_time; /* Время последнего входа в систему */

char ll_line[UT_NAMESIZE]; /* Терминал для удаленного входа */

char ll_host[UT_HOSTSIZE]; /* Имя компьютера, с которого

был выполнен удаленный вход */

};

Обратите внимание: приведенные записи не содержат имени или идентификатора пользователя. Вместо этого они индексируются по UID. То есть, чтобы найти в файле lastlog запись для пользователя с идентификатором 1000, нужно перейти к подходящему байту (1000 * sizeof(struct lastlog)). Это продемонстрировано в программе из листинга 40.4, которая позволяет просматривать записи для пользователей, указанных в командной строке. По своим функциям она похожа на команду lastlog(1). Ниже показан пример вывода, возвращаемого в результате ее выполнения:

$ ./view_lastlog annie paulh

annie tty2 Mon Jan 17 11:00:12 2011

paulh pts/11 Sat Aug 14 09:22:14 2010

Для обновления файла lastlog его точно так же нужно открыть, перейти в подходящую позицию и выполнить запись.

Поскольку lastlog проиндексирован по пользовательскому идентификатору, мы не можем отличить записи о входе в систему, относящиеся к разным именам пользователей с одним и тем же UID (в разделе 8.1 отмечалось, что вход с одного UID под разными именами хоть и является необычным, но вполне возможен).


Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных