Как посмотреть всех пользователей, включая скрытых и системных в Linux?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Просмотр пользователей в 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 namehome— домашняя директория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) — для людей.