← Назад к вопросам

Как посмотреть всех пользователей, включая скрытых и системных в Linux?

1.0 Junior🔥 91 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Просмотр пользователей в Linux: полный гайд

В Linux все пользователи, включая системных и скрытых, хранятся в одном месте. Давайте разберёмся, где их найти и как их просмотреть.

1. Файл /etc/passwd — основной источник

Это текстовый файл со всеми пользователями:

cat /etc/passwd

Формат строки:

username:x:uid:gid:gecos:home:shell

Расшифровка:

  • username — имя пользователя
  • x — пароль (на самом деле в /etc/shadow)
  • uid — ID пользователя (0 = root)
  • gid — ID основной группы
  • gecos — комментарий, обычно full name
  • home — домашняя директория
  • shell — shell, который использует пользователь

Пример вывода:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
postgres:x:114:121:PostgreSQL administrator:/var/lib/postgresql:/bin/bash
john:x:1000:1000:John Doe:/home/john:/bin/bash

2. Команда для списка пользователей

Самая простая:

# Просмотреть всех пользователей
cat /etc/passwd

# Только имена пользователей
cat /etc/passwd | cut -d: -f1

# Со сравнением более удобно
cut -d: -f1 /etc/passwd

3. Определение типов пользователей

Системные пользователи vs обычные:

# Только обычные пользователи (UID >= 1000)
awk -F: '$3 >= 1000 {print $1, "(UID: " $3 ")"}' /etc/passwd

# Пример вывода:
# john (UID: 1000)
# maria (UID: 1001)
# docker (UID: 1002)

# Только системные пользователи (UID < 1000)
awk -F: '$3 < 1000 && $3 > 0 {print $1, "(UID: " $3 ")"}' /etc/passwd

# Пример вывода:
# bin (UID: 1)
# daemon (UID: 2)
# syslog (UID: 104)
# postgres (UID: 114)

4. Команда getent для красивого вывода

getent читает базы данных NSS (более надёжно чем cat):

# Все пользователи
getent passwd

# Только имена
getent passwd | cut -d: -f1

# Конкретный пользователь
getent passwd john
# john:x:1000:1000:John Doe:/home/john:/bin/bash

# Количество пользователей
getent passwd | wc -l

5. Разделение на категории

Скрытые пользователи:

# Пользователи с shell=/bin/false или /sbin/nologin (не могут логиниться)
awk -F: '($7 ~ /false|nologin/)' /etc/passwd | cut -d: -f1

# Пример:
# bin
# daemon
# nobody
# www-data

# Это "неактивные" пользователи для системных сервисов

Активные пользователи (могут логиниться):

awk -F: '($7 ~ /bash|sh|zsh/)' /etc/passwd | cut -d: -f1

# Пример:
# root
# john
# maria

6. Подробная информация о пользователе

Информация о конкретном пользователе:

id john
# uid=1000(john) gid=1000(john) groups=1000(john),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),130(lxd),131(sambashare)

# UID и GID
id -u john  # 1000
id -g john  # 1000

# Все группы
id -G john  # 1000 4 24 27 30 46 120 130 131
groups john

7. Интерактивный просмотр

Команда who/w для активных сеансов:

# Кто сейчас залогинен
who

# john     pts/0        2024-03-22 10:15 (192.168.1.100)
# maria    pts/1        2024-03-22 10:20 (192.168.1.101)

# Более детально (где находятся, что делают)
w

#  10:45:31 up 3 days, 2:30,  2 users,  load average: 0.15, 0.10, 0.08
# USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
# john     pts/0    192.168.1.100    10:15    5.00s  0.05s  0.02s bash
# maria    pts/1    192.168.1.101    10:20   15.00s  0.10s  0.03s vim

# Последние логины
last
last john  # Только для john
lastlog    # Таблица последних логинов

8. Группы и членство

Файл /etc/group — список групп:

cat /etc/group

# Формат: groupname:x:gid:members
# sudo:x:27:john,maria
# docker:x:999:john

Члены группы:

# Члены группы sudo
getent group sudo

# Кто в группе docker
getent group docker

# Все группы пользователя
groups john

9. Использование Python для анализа

import pwd
import grp
import sys

# Все пользователи
print("=== Все пользователи ===")
for entry in pwd.getall():
    uid, username, shell = entry.pw_uid, entry.pw_name, entry.pw_shell
    is_system = uid < 1000
    can_login = 'bash' in shell or 'sh' in shell
    print(f"{username:15} UID: {uid:5} System: {is_system} Can login: {can_login}")

# Системные пользователи
print("\n=== Системные пользователи ===")
for entry in pwd.getall():
    if 0 < entry.pw_uid < 1000:
        print(f"{entry.pw_name} (UID: {entry.pw_uid})")

# Обычные пользователи
print("\n=== Обычные пользователи ===")
for entry in pwd.getall():
    if entry.pw_uid >= 1000:
        print(f"{entry.pw_name} (UID: {entry.pw_uid}) - {entry.pw_gecos}")

# Пользователь и его группы
print("\n=== Группы пользователя john ===")
try:
    user = pwd.getpwnam('john')
    print(f"UID: {user.pw_uid}, GID: {user.pw_gid}")
    
    # Основная группа
    main_group = grp.getgrgid(user.pw_gid)
    print(f"Основная группа: {main_group.gr_name}")
    
    # Все группы
    import os
    all_groups = os.getgroups()  # Работает для текущего пользователя
    print(f"Все группы текущего пользователя: {all_groups}")
except KeyError:
    print("Пользователь не найден")

10. Поиск по критериям

Пользователи без пароля:

# В /etc/passwd (старый способ, небезопасно)
awk -F: '($2 == "") {print $1}' /etc/passwd

# В /etc/shadow (правильно)
sudo awk -F: '($2 == "" || $2 == "!") {print $1}' /etc/shadow

Пользователи с определённым shell:

# Пользователи с bash
awk -F: '($7 ~ /bash$/) {print $1}' /etc/passwd

# Пользователи с nologin
awk -F: '($7 ~ /nologin$/) {print $1}' /etc/passwd

Пользователи в определённой группе:

# В группе sudo
getent group sudo | cut -d: -f4 | tr ',' '\n'

# В группе docker
getent group docker | cut -d: -f4 | tr ',' '\n'

11. Практический скрипт для аудита

#!/bin/bash

echo "=== Статистика пользователей ==="
echo "Всего пользователей: $(cat /etc/passwd | wc -l)"
echo "Системных (UID < 1000): $(awk -F: '$3 < 1000' /etc/passwd | wc -l)"
echo "Обычных (UID >= 1000): $(awk -F: '$3 >= 1000' /etc/passwd | wc -l)"

echo "\n=== Активные пользователи (могут логиниться) ==="
awk -F: '($7 ~ /bash|sh|zsh/) {printf "%-15s UID: %5d  Home: %s\n", $1, $3, $6}' /etc/passwd

echo "\n=== Неактивные системные пользователи ==="
awk -F: '($7 ~ /nologin|false/) && ($3 < 1000) {printf "%-15s UID: %5d\n", $1, $3}' /etc/passwd

echo "\n=== Пользователи залогинены сейчас ==="
w -h | awk '{print $1}' | sort -u

Итог

КомандаИспользование
cat /etc/passwdВсе пользователи в системе
getent passwdТо же, но из NSS базы
id usernameИнформация о пользователе
whoАктивные сеансы
wАктивные сеансы с деталями
lastИстория логинов
groups usernameГруппы пользователя
getent groupВсе группы в системе

Помните: системные пользователи (UID < 1000) используются для запуска сервисов, а обычные (UID >= 1000) — для людей.

Как посмотреть всех пользователей, включая скрытых и системных в Linux? | PrepBro