Чтобы вывести список пользователей 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 описывает одну учётную запись: семь полей через двоеточие.
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:
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-ключи обходят пароль полностью:
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/, поэтому проверьте и то и другое:
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 alicelast читает /var/log/wtmp, lastb читает /var/log/btmp, а lastlog читает /var/log/lastlog. В выводе lastlog напротив системных учётных записей должно стоять «**Never logged in**» (в русской локали Debian 12: «**Никогда не входил в систему**»).
# служба называется 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 её нет:
compgen -u # все пользователи
compgen -g # все группы
getent passwd | wc -l # сколько всего учётных записейКак вывести список пользователей в Windows Server
Windows хранит локальные учётные записи в собственной базе, и аналоги здесь короткие:
net user # все локальные учётные записи
net user alice # подробности, последний вход, группы
net localgroup administrators # у кого права администратора
net localgroup "Remote Desktop Users" # кто может входить по RDP
quser # кто вошёл прямо сейчас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).