who, w, last
Кто сейчас в системе и что делает, история входов и перезагрузок, неудачные попытки входа
Эти команды отвечают на вопросы «кто сейчас залогинен?», «что они запустили?» и «кто и когда входил раньше?». who и w читают список текущих сессий из /var/run/utmp, last — историю входов и перезагрузок из /var/log/wtmp, lastb — неудачные попытки входа из /var/log/btmp. Их используют при разборе инцидентов и перед перезагрузкой сервера — чтобы не выбросить из системы работающих людей.
Синтаксис
who [опции] [файл]
w [опции] [пользователь]
last [опции] [пользователь…] [терминал…]
lastb [опции] # то же, что last, но по /var/log/btmp
who — кто залогинен
| Опция | Что показывает |
|---|---|
| без опций | имя, терминал, время входа, откуда (в скобках) |
-H | добавить строку заголовков |
-q | только имена и общее число: # users=3 |
-b | время последней загрузки системы |
-r | текущий уровень запуска (runlevel) |
-u | добавить время простоя (. — активен в последнюю минуту, old — больше суток) и PID |
-a | всё сразу: -b -d --login -p -r -t -T -u |
-m, who am i | только твоя сессия (терминал, подключённый к stdin) |
-T | статус приёма сообщений write: +, -, ? |
файл | читать другой файл: who /var/log/wtmp — все входы из истории |
Связанные команды: whoami — имя текущего пользователя, users — имена залогиненных одной строкой, logname — под каким именем выполнен вход (не меняется после su).
w — кто что делает
Первая строка — как у uptime: текущее время, сколько система работает, число пользователей, средняя нагрузка за 1, 5 и 15 минут.
| Столбец | Что значит |
|---|---|
USER | пользователь |
TTY | терминал: pts/N — сессия ssh или окно терминала, ttyN — консоль |
FROM | откуда вход (IP или имя хоста; видно с -f, если скрыто) |
LOGIN@ | время входа |
IDLE | сколько терминал без ввода |
JCPU | время процессора всех процессов этого терминала |
PCPU | время процессора текущего процесса (из WHAT) |
WHAT | команда, которая сейчас выполняется в сессии |
| Опция | Что делает |
|---|---|
-h | без заголовка |
-s | короткий формат: без LOGIN@, JCPU, PCPU |
-f | переключить показ столбца FROM |
-i | показывать IP вместо имени хоста |
-p | показать PID процессов в WHAT |
-o | старый формат: пустые значения вместо нулевого времени простоя |
w пользователь | только сессии этого пользователя |
last — история входов
last читает /var/log/wtmp от новых записей к старым. В конце печатает, с какой даты начинается файл (wtmp begins …).
| Опция | Что делает |
|---|---|
-n 10, -10 | показать только 10 последних записей |
пользователь | только записи этого пользователя: last alice |
reboot | история перезагрузок (псевдопользователь) |
терминал | записи по терминалу: last pts/0 |
-s время / -t время | записи с указанного времени / до него: -s yesterday, -s 2024-05-01, -s -2days |
-p время | кто был в системе в указанный момент: -p '2024-05-01 15:00' |
-F | полные даты и время входа и выхода |
--time-format iso | формат времени: notime, short, full, iso |
-i | IP-адреса числами |
-d | преобразовать IP в имена хостов |
-a | имя хоста — в последний столбец (не обрезается) |
-R | не показывать столбец хоста |
-w | не обрезать длинные имена пользователей и доменов |
-x | также записи о выключении и смене уровня запуска |
-f файл | читать другой файл, например старый /var/log/wtmp.1 |
Формат строки: пользователь терминал хост вход - выход (длительность). Вместо времени выхода бывает:
| Запись | Что значит |
|---|---|
still logged in | сессия открыта сейчас |
still running | (для reboot) система работает с этой загрузки |
down | сессия закрылась при штатном выключении |
crash | система упала или перезагрузилась без закрытия сессии |
gone - no logout | процесс сессии исчез без записи о выходе |
Длительность: (01:05) — 1 час 5 минут, (2+04:00) — 2 дня и 4 часа.
lastb — неудачные входы
lastb принимает те же опции, что last, и читает /var/log/btmp — неверные пароли и несуществующие пользователи. Файл доступен только root. Последний вход каждого пользователя показывает lastlog (lastlog -u имя).
Примеры
# кто сейчас в системе, с заголовками
who -H
# сколько пользователей залогинено
who -q
# когда система загрузилась
who -b
uptime -s
# что сейчас делают пользователи, с IP
w -i
# последние 10 входов
last -n 10
# все входы пользователя за последние сутки, полные даты
last -F -s yesterday alice
# когда сервер перезагружался
last reboot | head
# кто был в системе в указанный момент
last -p '2024-05-01 15:00'
# топ IP по неудачным попыткам входа
lastb -i | awk '$3 ~ /^[0-9]/ { print $3 }' | sort | uniq -c | sort -rn | head
# посмотреть сырые записи wtmp
utmpdump /var/log/wtmp | tail -3
Подводные камни
- Пустой вывод не значит «никого не было». В контейнерах (и в песочнице) входы не идут через
login/sshd, поэтомуutmpиwtmpпусты:whoничего не печатает,lastвыводит толькоwtmp begins …. wtmpротируется.lastпоказывает только текущий файл; более старую историю смотри вlast -f /var/log/wtmp.1. Строкаwtmp beginsподсказывает, с какой даты есть данные.whoвидит только сессии с терминалом. Команды черезssh хост команда, cron-задачи и демоны вwhoиwне попадают — их ищи вps.crashне всегда авария сервера. Так помечается любая сессия, для которой нет записи о выходе до следующей загрузки, — в том числе при жёсткой перезагрузке виртуальной машины.- Имена и хосты обрезаются. Длинные имена пользователей и хостов в
lastурезаются по ширине столбца; используй-wи-a. lastbтребует root: у обычного пользователя — ошибка доступа к/var/log/btmp.