linux system users

who

Список пользователей, вошедших в систему прямо сейчас

Описание

who — утилита, показывающая список пользователей, у которых в данный момент есть активные сессии в системе. По умолчанию выводит: имя пользователя, терминал (tty/pts), дату и время входа, а также IP-адрес или имя хоста, с которого выполнен вход.

В уроке 24 who применяется в скрипте системного отчёта для подсчёта активных пользователей: who | wc -l — классический паттерн, где каждая строка вывода who соответствует одной сессии.

Команда читает информацию из файлов /var/run/utmp (активные сессии) и при флаге -a — из /var/run/wtmp (история входов/выходов).

Синтаксис

who [OPTIONS] [FILE] who am i # показать только текущую сессию # Список вошедших пользователей who # Только имена и счётчик who -q # Полная информация (все поля) who -a

Флаги и опции

ФлагОписание
(без флага)Список активных сессий: имя пользователя, терминал, время входа, хост
-b, --bootВремя последней загрузки системы
-q, --countТолько имена пользователей и итоговый счётчик (# users=N)
-H, --headingДобавить заголовок столбцов (NAME, LINE, TIME, COMMENT)
-a, --allВывести всю доступную информацию (объединяет несколько флагов)
-r, --runlevelТекущий уровень запуска системы (runlevel)
-s, --shortКраткий формат: только имя, терминал, время (поведение по умолчанию)
-u, --usersДобавить информацию о времени простоя (idle) каждой сессии
--lookupРазрешать имена хостов через DNS (может быть медленно)

Паттерны использования

Основные вызовы

# Список сессий
who
# Пример вывода:
# ec2-user pts/0  2025-06-12 14:15 (192.168.1.10)
# admin    pts/1  2025-06-12 14:22 (10.0.0.5)

# Только имена и счётчик
who -q
# ec2-user admin
# # users=2

# С заголовками столбцов
who -H

Из урока 24: подсчёт пользователей

#!/usr/bin/env bash
# system_report.sh

# Подсчитать активные сессии
active_users=$(who | wc -l)
echo "Active users: $active_users"

# Или через who -q
who -q | grep "# users=" | awk -F'=' '{print $2}'

Мониторинг и оповещения

#!/usr/bin/env bash
# Предупредить если пользователей больше порога
max_users=5
current=$(who | wc -l)

if [ "$current" -gt "$max_users" ]; then
  echo "WARNING: $current users logged in (max $max_users)"
  who    # показать кто именно
fi

Дополнительные сведения

# Время последней загрузки
who -b
# system boot  2025-06-10 08:35

# Текущая сессия (кто я)
who am i
# ec2-user pts/0  2025-06-12 14:15 (192.168.1.10)

# Полная информация + заголовки
who -aH

Советы и предупреждения

Совет: who vs w vs users
who — базовый список сессий. w — расширенная версия: добавляет то, что делает пользователь прямо сейчас (текущий процесс) и load average. users — только имена через пробел, без дат и хостов. Для скриптов обычно достаточно who | wc -l для подсчёта.
Совет: each line = one session
Один пользователь может иметь несколько строк в выводе who, если он подключён из нескольких терминалов (например, несколько SSH-сессий). who | wc -l считает сессии, не уникальных пользователей. Для уникальных пользователей: who | awk '{print $1}' | sort -u | wc -l.
Внимание: who и контейнеры
Внутри Docker-контейнеров who часто выводит пустой результат, поскольку контейнер не использует стандартную систему utmp. Это нормальное поведение — не признак ошибки.