Якщо у вас випадково видалився обліковий запис або група, не панікуйте 🛟 Я покажу, як акуратно відновити користувача та групу в Linux, повернути той самий UID/GID, домашню директорію та права доступу. Працюватимемо у термінал Linux і торкнемося теми права доступу Linux та резервне копіювання системи, щоб усе працювало як раніше.

Покрокова інструкція відновлення

1. Перевіряємо резервні копії та знімки системи

Найпростіший шлях — відкотити файли ідентифікаторів із бекапу. Нас цікавлять:

  • /etc/passwd, /etc/group — облікові записи та групи;
  • /etc/shadow, /etc/gshadow — хеші паролів і метадані;
  • /var/backups/passwd-, group-, shadow- — автоматичні копії деяких дистрибутивів.
# Подивитися наявні резервні копії
ls -l /var/backups/{passwd,group,shadow}*

# Знайти UID/GID видаленого користувача у копії
awk -F: '$1=="username"{print "USER:",$1,"UID:",$3,"GID:",$4,"HOME:",$6,"SHELL:",$7}' /var/backups/passwd-

# Якщо є Timeshift/Borg/Restic — відновіть лише потрібні файли з /etc
# (приклад із Borg)
borg mount /path/to/repo /mnt/borg
awk -F: '$1=="username"' /mnt/borg/latest/etc/passwd

Зафіксуйте собі: ім'я користувача, UID, первинну групу або GID, домашню директорію та оболонку.

2. Витягуємо старі параметри без бекапів (якщо треба)

Коли бекапів нема, UID можна знайти по «осиротілих» файлах на диску — вони залишаються з числовим власником.

# Скануємо файлову систему в межах кореневого розділу (уникаємо /proc, /sys, /dev)
sudo find / -xdev -nouser -o -nogroup 2>/dev/null | head

# Подивитись UID файла
ls -n /path/to/file  # покаже числовий UID/GID

Так ви зможете визначити потрібний UID/GID і прив'язати їх до відновленого акаунта.

3. Відновлюємо групу з тим самим GID

Спочатку створюємо групу (якщо вона була окрема й видалена):

# Приклад: група mygroup із GID 1234
sudo groupadd -g 1234 mygroup

Якщо первинна група була така ж, як ім'я користувача, замініть mygroup на username та вкажіть знайдений GID.

4. Відновлюємо користувача з тим самим UID

Тепер додаємо користувача, не створюючи нову домашню директорію, якщо стара лишилася:

# Якщо /home/username вже існує
sudo useradd -u 1001 -g 1234 -M -d /home/username -s /bin/bash username

# Якщо /home/username відсутня — дайте -m, щоб створити її
sudo useradd -u 1001 -g 1234 -m -d /home/username -s /bin/bash username

Відновлюємо пароль або змушуємо його змінити при першому вході:

echo 'username:TempP@ss' | sudo chpasswd
sudo chage -d 0 username

Повертаємо членство в додаткових групах (звірте зі старим /etc/group-):

# Додайте потрібні групи, наприклад sudo, docker, audio
sudo usermod -aG sudo,docker,audio username

5. Відновлюємо домашню директорію та ключі SSH

Якщо є бекап домашньої директорії — розпакуйте його з правильними правами:

# Приклад відновлення з tar-архіву
sudo tar -xpf /backups/home-username.tar -C /

# Перевіряємо власника та права
sudo chown -R username:mygroup /home/username
sudo find /home/username -type d -exec chmod 700 {} +
sudo find /home/username -type f -name authorized_keys -exec chmod 600 {} +

Не забудьте про SSH:

sudo mkdir -p /home/username/.ssh
sudo chown -R username:mygroup /home/username/.ssh
sudo chmod 700 /home/username/.ssh
sudo chmod 600 /home/username/.ssh/authorized_keys

6. Повертаємо власників файлів по всій системі

Якщо UID користувача було використано у багатьох місцях поза /home, проіндексуйте файлову систему й поверніть власника. Обережно: не чіпайте системні псевдофайлові системи.

# Для кожного розділу окремо (приклад для / та /data)
sudo find / -xdev -uid 1001 -exec chown -h username:mygroup {} +
sudo find /data -xdev -uid 1001 -exec chown -h username:mygroup {} +

# Поштова скринька, якщо використовується локальна пошта
sudo touch /var/mail/username
sudo chown username:mail /var/mail/username

Якщо у вас використовуються ACL, перевірте їх:

# Подивитись ACL
getfacl -R /home/username | less
# При потребі — відновлення з вашого бекапу ACL через setfacl --restore

У системах з SELinux виконайте:

sudo restorecon -RFv /home/username

7. Перевіряємо вхід і середовище

Увійдіть як відновлений користувач (TTY/SSH) та переконайтесь, що оболонка, PATH і налаштування працюють. Перевірте sudo, cron/systemd user timers, відновіть конфіги в ~/.config за потреби.

Альтернативні способи

  • Відновлення /etc/passwd-, /etc/group- з файлової системи ext4 за допомогою extundelete або testdisk (потрібне відмонтування розділу та робота з копією диска).
  • Якщо користувачі керуються центрально (LDAP/SSSD), перевірте каталог — можливо, локальне відновлення не потрібне.
  • systemd-homed: якщо акаунт керувався через homed, використовуйте homectl і резервні JSON-метадані для відновлення.

GUI-спосіб (коли доречно)

У GNOME «Налаштування → Користувачі» або KDE «Система → Користувачі» можна створити обліковий запис і додати до груп. Але точний UID/GID у GUI зазвичай не задається — після створення відкоригуйте в терміналі:

# Змінити UID/GID існуючого користувача та оновити власників у файлах
sudo usermod -u 1001 -g 1234 -d /home/username -m username
sudo find / -xdev -uid 1001 -exec chown -h username:mygroup {} +

Тобто GUI — для швидкого створення, а точне відновлення ідентифікаторів і прав завершуємо у термінал Linux.

FAQ

  • UID уже зайнятий іншим користувачем. Що робити?
    Або змініть UID того іншого (ризиковано), або створіть відновлюваному новий UID і масово замініть власника файлів зі старого UID на нового через find + chown.
  • Немає /var/backups/*- файлів.
    Скануйте файлову систему на osirotili файли (nouser/nogroup), шукайте UID у логах (наприклад, auth.log), або дістаньте знімок з вашого інструмента резервне копіювання системи.
  • Домашня директорія була зашифрована (eCryptfs/LUKS)?
    Для eCryptfs спробуйте sudo ecryptfs-recover-private. Для LUKS спочатку розблокуйте том, потім монтуйте і відновлюйте дані як звичайно.
  • Зник доступ sudo.
    Додайте користувача до групи sudo (або wheel у RPM-дистрибутивах): sudo usermod -aG sudo username.
  • Файли були на кількох розділах/NFS.
    Запускайте find окремо на кожному розділі з -xdev. Для NFS врахуйте відображення UID/GID на сервері.
  • Злетіли cron-завдання.
    Перевірте /var/spool/cron/crontabs/username та systemd user timers (~/.config/systemd/user). Відновіть власника і права.
  • SSH не пускає.
    Перевірте права: ~/.ssh 700, authorized_keys 600; власник — відновлений користувач.

Порада від Kernelka

Щоб не страждати наступного разу, робіть маленькі, але регулярні бекапи ідентифікаторів та груп. Ось простий скрипт-«нагадувач» для ваших bash скрипти 💡

#!/usr/bin/env bash
set -euo pipefail
DST=/root/ids-$(date +%F)
sudo mkdir -p "$DST"
sudo cp -a /etc/passwd  "$DST"/
sudo cp -a /etc/group   "$DST"/
sudo cp -a /etc/shadow  "$DST"/
sudo cp -a /etc/gshadow "$DST"/
echo "IDs snapshot saved to $DST"

Збережіть його як /usr/local/sbin/backup-ids.sh, додайте у cron або systemd timer — і ви завжди матимете свіжу «точку відкату» для користувачі та групи Linux.

Підсумок

  • Знайдіть старі UID/GID у бекапах або по осиротілих файлах.
  • Спершу відновіть групу з правильним GID, потім користувача з UID.
  • Поверніть власників файлів і перевірте ACL/SELinux контексти.
  • Відновіть домашню директорію, SSH-ключі, sudo і cron.
  • Налаштуйте регулярні бекапи /etc/passwd, /etc/group тощо — це економить нерви і час 🔧