Pull to refresh

Comments 14

Пригодится, спасибо) пусть я и гордый админ локалхоста)
Люблю Ваши статьи, обычно интересные и развёрнутые. Но на этот раз — почти ман, чуть подробнее.
Кстати,
# lastlog | grep Never | awk '{print $1}'

вполне удобнее заменить на:
$ lastlog | awk '/Never/{print $1}'
Кстати, оба варианта ошибочно в данном случае отобразят юзера Never, если таковой имеется в системе.
Я на этом месте статьи в который раз подумал, что надо бы написать свой пост под заголовком «grep не нужен».

И вы вскрыли только самый поверхностный слой проблем этого однострочника. А что если в системе есть пользователь 'DieNever'? Но самое страшное — вот:
$ LC_MESSAGES='ru_RU.UTF-8' lastlog | grep '^nobody'
nobody                                     **Никогда не входил в систему**

Но я не вижу утилиты, которая бы позволила получить список никогда не логинившихся пользователей семантически правильно. Похоже, в данном случае без фильтрации строк по шаблону не обойтись. Для надёжности стоит сделать хотя бы так:
lastlog | awk '/\*\*$/{print $1}'
Как вариант более-менее универсальный:
LC_ALL=C lastlog ...
Ну с таким подходом – для вас единственно-правильный вариант будет парсить /var/log/lastlog

Вот например простенький one-liner из интернетов, который выводит информацию из lastlog в понятном человеку виде виде

perl -we '$recs = ""; while (<>) {$recs .= $_};$uid = 0;foreach (split(/(.{292})/s,$recs)) {next if length($_) == 0;my ($binTime,$line,$host) = $_ =~/(.{4})(.{32})(.{256})/;if (defined $line && $line =~ /\w/) {$line =~ s/\x00+//g;$host =~ s/\x00+//g;printf("%5d %s %8s %s\n",$uid,scalar(gmtime(unpack("I4",$binTime))),$line,$host)}$uid++}print"\n"' < /var/log/lastlog

Тут лишь нужно учитывать, что в зависимости от архитектуры и версий, структура данных может быть не только 4+32+256

Беглое изучение вопроса показало, что встречаются также другие варианты и самый верный способ — посмотреть соответствующие значения в хедерах (например для Linux это будут UT_LINESIZE и UT_HOSTSIZE в /usr/include/bits/utmp.h)
/ информация выше взята из этой статьи /

Нужно понимать, что lastlog хранит только записи о логинившихся пользователях, а т.к. исходная задача стояла в получении тех, кто не логинился ни разу – то, соответственно, ими являются все остальные UIDы, кроме полученных в выводе этого скрипта.
И если идти до конца, то самым надёжным/правильным способом будет не парсить lastlog своим поделием, а дописать утилите last дополнительные ключи запуска, которые позволят выводить только никогда не логинившихся пользователей (и заслать патч в апстрим).

Вообще ваш комментарий мне ценен больше тем, что заставил меня задуматься (не впервые, впрочем), что возможны разные точки зрения на оптимальный баланс качества результата и количества приложенных усилий.
Чтобы узнать дату создания файла wtmp, следует ввести в консоли last mia

Так же можно ввести last vincent или же last jules, равно как и имя любого другого существующего или не очень существующего пользователя системы.

На самом деле команда last USERNAME выводит содержимое lastlog для конкретного пользователя, не более того. После вывода лога, она добавляет строку с датой и временем создания соответствующих логфайлов и если по конкретному пользователю записей нет — в вывод попадает только эта вспомогательная информация
Но давайте будем честны, это всего лишь вольный пересказ вот этой статьи близко к тексту.
Хоть бы из вежливости об оригинале вспомнили
использование команды сортировки head

head не сортирует, а всего лишь выводит n-строк от начала файла.

Чтобы узнать дату создания файла wtmp, следует ввести в консоли last mia:

Для того, чтобы узнать дату создания файла, существует команда stat

можете использовать еще и команду more, которая в отличие от команды less, выведет содержимое файла на экран отдельными страницами

Что за бред? На фоне less утилита more представляет из себя убогий pager. О чём, кстати, упоминает man more.

Это и в самом деле так, и означает лишь только то, что для оболочек, назначенных в момент регистрации пользователей (login shells), задан параметр /sbin/nologin, что делает авторизацию невозможной.

Это означает лишь только то, что пользователь с данным логином ни разу не авторизовался в системе. Оболочка (шелл) тут вторична.

Также она позволяет поддерживать более одного wtmp файл

Не позволяет. /var/log/wtmp один. Все остальные (в данном контексте) — его архивные копии.

ps: пардон за снобизм. статья в целом интересная для новичков, но уж слишком много допущено в ней ошибок.
Статья отличная! Прочитал на одном дыхании. А можно еще подобную на тему «Как же посмотреть список файлов в каталоге?»
Я считаю, что если вам очень важно знать кто был на сервере, то нужно в момент логина дублировать факт входа куда-либо на стороннее оборудование.
К примеру, отправлять email на технический email.
Статья переводная, а источник не указан. Некрасиво.
Sign up to leave a comment.