Руководства

Список пользователей Linux: как вывести всех пользователей и группы и узнать, кто в системе

Как вывести список пользователей Linux и Ubuntu: все учётные записи через getent passwd, только людей по UID, их группы через id и кто сейчас в системе.

Опубликовано ~9 мин чтения
На этой странице

Чтобы вывести список пользователей Linux, выполните getent passwd | cut -d: -f1. Команда печатает все учётные записи, которые знает система, по одному имени на строку. Большинство из них системные: от их имени работают службы. Учётные записи людей — это те, у которых идентификатор пользователя (UID) 1000 или больше, и awk отбирает их из /etc/passwd:

любой дистрибутив
# все учётные записи
getent passwd | cut -d: -f1

# только учётные записи людей (UID от 1000, без "nobody")
awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd

# группы, а также группы одного пользователя
getent group | cut -d: -f1
id alice

# кто сейчас в системе
who

Эти команды одинаково работают в Ubuntu, Debian, Rocky Linux и Alma, так что список пользователей в Ubuntu выводится точно так же. Ниже: что значат поля, как увидеть, кто на самом деле может войти, у кого есть sudo, кто заходил недавно и как проверить сервер на учётные записи, которых там быть не должно.

Что значат семь полей в /etc/passwd

Каждая строка /etc/passwd описывает одну учётную запись: семь полей через двоеточие.

строка из /etc/passwd
alice:x:1000:1000:Alice Example,,,:/home/alice:/bin/bash
  • alice: имя для входа (логин).
  • x: поле пароля. x значит, что хеш пароля лежит в /etc/shadow, который может читать только root. Сам файл passwd доступен на чтение всем, и так уже не одно десятилетие.
  • 1000: UID, число, с которым на самом деле работает ядро. UID 0 — это root, как бы ни называлась учётная запись.
  • 1000: GID основной группы.
  • Alice Example,,,: поле комментария (GECOS) с полным именем и необязательными контактными данными.
  • /home/alice: домашний каталог.
  • /bin/bash: оболочка входа. /usr/sbin/nologin или /bin/false означает, что получить оболочку эта учётная запись не может.

getent passwd читает те же данные плюс учётные записи из LDAP или Active Directory, если сервер подключён к каталогу. cat /etc/passwd показывает только локальные записи. На отдельно стоящем VPS обе команды выводят одинаковый список.

Какие учётные записи системные, а какие принадлежат людям

Их различает UID. Debian, Ubuntu, Rocky и Alma оставляют малые номера системе и начинают учётные записи людей с 1000:

  • 0: root.
  • от 1 до 999: системные учётные записи, такие как daemon, www-data (в Rocky вместо неё nginx и apache), mysql, sshd, и всё, что добавляют пакеты. От их имени работают службы, входить под ними никто не должен.
  • 1000 и выше: учётные записи людей, созданные командой adduser или useradd.
  • 65534: nobody, заглушка без прав, поэтому фильтр выше останавливается перед этим номером.

Границы заданы в /etc/login.defs параметрами UID_MIN и UID_MAX. Если их кто-то менял, берите значение оттуда, а не считайте, что это 1000:

учётные записи людей по UID_MIN самой системы
awk -F: -v min="$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)" \
  '$3>=min && $3<65534 {print $1, $3, $6}' /etc/passwd

Какие пользователи на самом деле могут войти

Учётная запись может открыть оболочку, если её оболочка настоящая, а не nologin или false. Эта команда выводит такие учётные записи вместе с их оболочкой:

учётные записи с рабочей оболочкой
getent passwd | awk -F: '$7 !~ /(nologin|false)$/ {print $1, $7}'

В Debian и Ubuntu в этом списке будет sync с оболочкой /bin/sync. Это нормально: такая «оболочка» только сбрасывает данные на диск и завершается. Всё остальное в списке стоит проверить внимательнее.

Оболочка — только половина картины. Сможет ли кто-то войти по паролю, зависит от состояния пароля, а SSH-ключи обходят пароль полностью:

состояние пароля (Debian, Ubuntu)
sudo passwd -S -a     # P = рабочий пароль, L = заблокирован, NP = без пароля
sudo passwd -S alice  # одна учётная запись; работает и в Rocky, и в Alma

Заблокированный пароль (L) закрывает вход по паролю. Вход по SSH-ключу он не обязательно закрывает, поэтому проверьте и ключи, как описано ниже.

Как вывести список групп и их участников

группы
getent group                     # все группы: имя:x:GID:участники
getent group sudo                # одна группа и её участники
id alice                         # UID alice, основная группа и все остальные группы
groups alice                     # только имена групп

# только группы, в которых перечислены участники
getent group | awk -F: '$4 != "" {print $1": "$4}'

Одна деталь регулярно сбивает с толку. Список участников в /etc/group содержит только тех, кого в группу добавили. Основная группа пользователя, GID из /etc/passwd, там не повторяется. Поэтому getent group alice обычно не показывает ни одного участника, хотя alice в этой группе состоит. id alice всегда показывает полный набор, включая основную группу. Как добавить пользователя в группу и не потерять при этом остальные его группы, разобрано в статье о команде usermod -aG.

У кого есть права sudo на сервере

В Debian и Ubuntu права sudo обычно даёт членство в группе sudo, в Rocky и Alma — в группе wheel. Правила также можно прописать прямо в /etc/sudoers или в файле в /etc/sudoers.d/, поэтому проверьте и то и другое:

кто может пользоваться sudo
getent group sudo                      # Debian, Ubuntu
getent group wheel                     # Rocky, Alma
sudo grep -rE '^[^#[:space:]]' /etc/sudoers /etc/sudoers.d/   # все действующие правила
sudo -l -U alice                       # что alice может запускать, с точки зрения sudo

Строка вроде %sudo ALL=(ALL:ALL) ALL даёт полные права всей группе; строка, которая начинается с имени пользователя, даёт права только ему, а NOPASSWD значит, что пароль не спрашивается. Строки Defaults задают настройки, а не права, а строка root ALL=(ALL:ALL) ALL есть в стандартном файле. Как правильно выдать учётной записи права sudo, описано в статье о создании пользователя с sudo (англ.). Если на сервере нет даже самой команды, начните со статьи sudo: command not found (англ.).

Кто сейчас в системе

текущие сеансы
who        # кто вошёл, на каком терминале и с какого IP
w          # то же плюс время простоя и что запущено в каждом сеансе
users      # только имена, одной строкой
loginctl list-sessions   # взгляд systemd, включая сеансы без терминала

У удалённого сеанса who показывает IP-адрес клиента в скобках, а w — в столбце FROM. Если видите незнакомый адрес, запишите его, прежде чем делать что-то ещё.

Кто входил недавно

история входов
last -n 20              # последние 20 входов с IP-адресом и длительностью
last alice              # входы одного пользователя
last reboot             # когда сервер перезагружался
sudo lastb -n 20        # неудачные попытки входа (только root)
lastlog                 # последний вход каждой учётной записи
lastlog -u alice

last читает /var/log/wtmp, lastb читает /var/log/btmp, а lastlog читает /var/log/lastlog. В выводе lastlog напротив системных учётных записей должно стоять «**Never logged in**» (в русской локали Debian 12: «**Никогда не входил в систему**»).

входы по SSH из журнала
# служба называется ssh в Debian и Ubuntu и sshd в Rocky и Alma
sudo journalctl -u ssh -u sshd --since "7 days ago" | grep -E 'Accepted|Failed password|Invalid user'

Accepted publickey for alice from 198.51.100.7 означает успешный вход по ключу. Сотни строк Invalid user с незнакомых адресов — это боты, которые подбирают логины; такое видит любой сервер в интернете. Значение они имеют, только если за одной из них следует Accepted.

Какие учётные записи могут войти по SSH-ключу

Каждый ключ в ~/.ssh/authorized_keys учётной записи — это вход, который не закрыть сменой пароля. Команда ниже выводит ключи всех учётных записей, включая root, вместе с комментарием в конце строки ключа, где часто стоит имя владельца или его машины:

все разрешённые ключи на сервере
sudo sh -c 'getent passwd | while IFS=: read -r user _ _ _ _ home _; do
  for f in "$home/.ssh/authorized_keys" "$home/.ssh/authorized_keys2"; do
    [ -f "$f" ] && echo "== $user: $f" && cat "$f"
  done
done'

# где sshd ищет ключи на самом деле (путь можно изменить в настройках)
sudo sshd -T | grep -i authorizedkeysfile

Любой ключ, который вы не можете связать с конкретным человеком или инструментом деплоя, стоит удалить. Как перевести SSH только на ключи и ограничить круг тех, кто вообще может войти, рассказано в статье о защите доступа по SSH.

Как найти учётную запись, которой быть не должно

После взлома злоумышленники любят оставить себе путь назад: новую учётную запись, вторую запись с UID 0 или ключ, добавленный пользователю root. Эти проверки занимают минуту:

быстрый аудит учётных записей
# любая учётная запись с UID 0, кроме root, это бэкдор
awk -F: '$3==0 {print $1}' /etc/passwd

# учётные записи с пустым полем пароля
sudo awk -F: '$2=="" {print $1}' /etc/shadow

# учётные записи людей и их оболочки
awk -F: '$3>=1000 && $3<65534 {print $1, $7}' /etc/passwd

# когда файлы учётных записей менялись в последний раз
ls -l --time-style=long-iso /etc/passwd /etc/shadow /etc/group /etc/sudoers

# недавно созданные или изменённые учётные записи, если журнал хранится достаточно долго
sudo journalctl -t useradd -t usermod -t groupadd --since "30 days ago"

Что считать неожиданным, зависит от того, с чем сервер начинал, поэтому на новом сервере сохраните список (getent passwd > ~/accounts-day1.txt) и позже сравните с ним текущий через diff. Любая учётная запись человека, которую вы не создавали сами, заслуживает внимания. Неизвестная учётная запись часто появляется вместе с незнакомым процессом, который съедает процессор; что искать в этом случае и почему переустановка лучше чистки, написано в разделе о криптомайнерах статьи о высокой нагрузке на CPU (англ.).

Есть ли способ короче в bash?

Да. compgen — встроенная команда bash для автодополнения имён, и она умеет сразу выводить пользователей и группы. Чтобы быстро посмотреть, это удобно, но печатает она только имена, а в sh и zsh её нет:

только bash
compgen -u    # все пользователи
compgen -g    # все группы
getent passwd | wc -l   # сколько всего учётных записей

Как вывести список пользователей в Windows Server

Windows хранит локальные учётные записи в собственной базе, и аналоги здесь короткие:

cmd или PowerShell
net user                                   # все локальные учётные записи
net user alice                             # подробности, последний вход, группы
net localgroup administrators              # у кого права администратора
net localgroup "Remote Desktop Users"      # кто может входить по RDP
quser                                      # кто вошёл прямо сейчас
PowerShell
Get-LocalUser | Format-Table Name, Enabled, LastLogon
Get-LocalGroupMember -Group Administrators

Если разбираетесь с подозрительным входом, первым делом посмотрите на включённые учётные записи в группах администраторов и пользователей удалённого рабочего стола: именно они могут получить рабочий стол на сервере.

Все команды на этой странице работают на любом Linux VPS с root-доступом, от одноразового тестового сервера до тарифа Standard KVM, на котором вы работаете годами.

Частые вопросы

Как вывести список всех пользователей в Linux и Ubuntu?

Команда getent passwd | cut -d: -f1 печатает все учётные записи по одной на строку, включая десятки системных, от имени которых работают службы. Только учётные записи людей покажет awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd: граница 1000 задана как UID_MIN в /etc/login.defs. В Ubuntu, Debian, Rocky Linux и Alma команды одинаковые.

Что лучше: getent passwd или cat /etc/passwd?

getent passwd. Она возвращает локальные учётные записи из /etc/passwd и, если сервер подключён к каталогу, записи из LDAP или Active Directory, ровно так, как их видит система. cat /etc/passwd показывает только локальные записи. На отдельно стоящем VPS обе команды выводят одинаковый список.

Как узнать, когда пользователь последний раз входил в систему?

lastlog -u alice показывает последний вход одной учётной записи, а last alice выводит историю входов этого пользователя с IP-адресами и длительностью сеансов. В некоторых новых выпусках, например в Debian 13, эти команды заменены на lastlog2 и пакет wtmpdb; если их нет, установите эти пакеты или ищите входы в журнале SSH командой journalctl -u ssh (в Rocky и Alma служба называется sshd).

Читайте также

Все статьи раздела

Что такое SSH и как защитить подключение к серверу

SSH — протокол для защищённого удалённого доступа к серверу. Как подключиться по SSH и настроить вход только по ключу, fail2ban и файрвол за один проход.

Как добавить пользователя в группу в Linux: usermod -aG, gpasswd и adduser

Как добавить пользователя в группу в Linux: sudo usermod -aG ГРУППА ПОЛЬЗОВАТЕЛЬ и новый вход. Почему важен -a, gpasswd, adduser и как создать пользователя.

Как проверить и открыть порты в Linux

Как проверить, что порт в Linux действительно слушает, и как его открыть: команды ss и lsof, правила UFW и firewalld, и тест доступности порта снаружи сервера.

Порт SSH 22: порт по умолчанию, как узнать, какой слушает сервер, и подключиться к другому

SSH по умолчанию слушает TCP-порт 22. Как узнать, какой порт использует сервер, проверить, открыт ли он, и подключиться к другому порту через ssh, scp и rsync.

sudo: command not found? Install it the right way(англ.)

sudo is not installed. Become root with su -, run apt install sudo, then usermod -aG sudo USERNAME and log in again. Docker, Alpine, macOS and Windows too.

bash: Permission denied? Why your script will not run(англ.)

Permission denied on a script usually means the execute bit is missing, or the file lives on a noexec mount. How to tell which, and fix both safely.

chown: change file ownership on Linux, with -R and user:group(англ.)

sudo chown USER:GROUP FILE changes who owns a file; add -R for a whole directory. Who is allowed to chown what, numeric UIDs, --reference, and chown vs chmod.

awk command: columns, patterns, sums and real log examples(англ.)

The awk command prints columns ($1, $NF), filters lines by pattern and sums or counts in END. Real nginx log one-liners, printf, and mawk vs gawk.