15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
09.10.2024

useradd срещу adduser: Технически разлики, случаи на употреба и кога да използвате всеки от тях

`useradd` е нискониво двоично помощно средство, налично на практически всяка Linux дистрибуция, което създава потребителски акаунти чрез директно записване в `/etc/passwd`, `/etc/shadow` и `/etc/group`. `adduser` е скрипт-обвивка от по-високо ниво — обикновено написан на Perl в системи, базирани на Debian — който извиква `useradd` вътрешно, като същевременно автоматизира създаването на домашна директория, попълването на skeleton файлове, заявката за парола и събирането на GECOS полета. Практическата разлика не е само в удобството: изборът на грешен инструмент в автоматизиран pipeline за осигуряване или на система, различна от Debian, може безшумно да доведе до непълни потребителски акаунти.

И двете команди в крайна сметка регистрират потребител в базата данни за удостоверяване на системата, но тяхното поведение се различава значително по подразбиращи се настройки, интерактивност, преносимост и възможност за скриптиране. Това ръководство обхваща всяко техническо различие, което администраторът трябва да знае, за да вземе информирано решение.

Какво всъщност прави useradd под капака

`useradd` е част от пакета shadow-utils (понякога наричан `passwd` в по-стари дистрибуции). При извикване той извършва поредица от атомарни операции:

  1. Чете `/etc/login.defs`, за да определи диапазоните на UID, политиките за остаряване на паролата и дали да създаде домашна директория по подразбиране.
  2. Чете `/etc/default/useradd` за подразбиращата се обвивка, пътя до skeleton директорията и поведението на групата.
  3. Записва нов запис в `/etc/passwd` и `/etc/shadow`.
  4. По избор създава домашна директория и копира файлове от `/etc/skel`, ако `-m` е изрично подаден.
  5. По избор създава частна група, съответстваща на потребителското име, ако `USERGROUPS_ENAB` е зададен на `yes` в `/etc/login.defs`.

Критична точка, която много ръководства пропускат: при дистрибуции, базирани на Red Hat (RHEL, CentOS, Rocky Linux, AlmaLinux), `useradd` създава домашната директория по подразбиране, тъй като `/etc/login.defs` задава `CREATE_HOME yes`. При Debian и Ubuntu това не се случва — флагът `-m` е задължителен, освен ако не промените `/etc/default/useradd`. Тази поведенческа асиметрия е честа причина за объркване, когато администраторите мигрират между фамилии дистрибуции.

Основни флагове и тяхното поведение

ФлагПредназначениеБележки
———————-
`-m`Създаване на домашна директорияЗадължително при Debian/Ubuntu без промяна на конфигурацията
`-d /path`Задаване на персонализиран път до домашната директорияНе създава директорията, освен ако не е използван и `-m`
`-s /bin/bash`Задаване на обвивка за входПо подразбиране е `/bin/sh` или стойността в `/etc/default/useradd`
`-u UID`Задаване на конкретен UIDТрябва да е уникален; използвайте `-o` за разрешаване на дублирания
`-g GID`Задаване на основна групаГрупата трябва вече да съществува
`-G group1,group2`Добавяне на допълнителни групиРазделени със запетая, без интервали
`-e YYYY-MM-DD`Дата на изтичане на акаунтаЗаписва се в `/etc/shadow` поле 8
`-f days`Период на неактивност на паролатаДни след изтичане преди заключване на акаунта
`-r`Създаване на системен акаунтUID под `SYS_UID_MAX` в `/etc/login.defs`, без домашна директория по подразбиране
`-M`Изрично да не се създава домашна директорияОтменя подразбиращите се настройки на дистрибуцията
`-N`Да не се създава частна група за потребителяОсновната група на потребителя става групата по подразбиране
`-k /path`Задаване на алтернативна skeleton директорияОтменя `/etc/skel`

Практически пример за useradd с пълни опции

“`bash

useradd

-m

-d /srv/appuser

-s /bin/bash

-u 1500

-g developers

-G sudo,docker

-e 2025-12-31

-c "Application Service Account"

appuser

passwd appuser

“`

Паролата не се задава, докато не бъде извикан `passwd`. До тогава акаунтът съществува, но е заключен — записът в shadow съдържа `!` като хеш на паролата, предотвратявайки влизане чрез удостоверяване с парола. Влизането чрез SSH ключ обаче не се влияе от това състояние.

Какво всъщност прави adduser под капака

При Debian и Ubuntu, `adduser` е Perl скрипт, намиращ се в `/usr/sbin/adduser`. Той чете собствената си конфигурация от `/etc/adduser.conf` — отделен файл от `/etc/login.defs` — и след това извиква `useradd` с подходящите флагове въз основа на тази конфигурация и потребителския вход.

Скриптът извършва допълнителни стъпки, които `useradd` сам по себе си не прави:

  • Интерактивно заявява парола и я потвърждава с второ въвеждане.
  • Събира GECOS полета (пълно име, номер на стая, работен телефон, домашен телефон, друго) чрез насочени подкани.
  • Копира skeleton файлове от `/etc/skel` автоматично, без да изисква `-m`.
  • Задава правилна собственост и разрешения на домашната директория.
  • По избор добавя потребителя към допълнителни групи, дефинирани в `/etc/adduser.conf`.

При системи, базирани на Red Hat, `adduser` обикновено е символна връзка към `useradd`, което означава, че се държи идентично с нискониво двоичния файл — няма интерактивна обвивка. Това е единственият най-важен проблем с преносимостта при писане на скриптове за различни дистрибуции.

Конфигурационен файл на adduser: /etc/adduser.conf

Ключови директиви в `/etc/adduser.conf`, които влияят на поведението:

“`

DSHELL=/bin/bash # Default shell

DHOME=/home # Parent directory for home directories

GROUPHOMES=no # Whether to create group-named subdirectories

LETTERHOMES=no # Whether to use first-letter subdirectories

USERGROUPS=yes # Create a group with the same name as the user

USERS_GID=100 # Default GID if USERGROUPS=no

DIR_MODE=0755 # Permissions on new home directories

SETGID_HOME=no

QUOTAUSER=""

SKEL=/etc/skel

SKEL_IGNORE_REGEX="dpkg-(old|new|dist|tmp)"

“`

Промяната на този файл ви позволява да стандартизирате създаването на потребители в цял парк от Debian/Ubuntu сървъри, без да подавате флагове всеки път.

Практически пример за adduser

“`bash

adduser customuser

“`

Интерактивната сесия изглежда така:

“`

Adding user 'customuser' …

Adding new group 'customuser' (1001) …

Adding new user 'customuser' (1001) with group 'customuser' …

Creating home directory '/home/customuser' …

Copying files from '/etc/skel' …

New password:

Retype new password:

passwd: password updated successfully

Changing the user information for customuser

Enter the new value, or press ENTER for the default

Full Name []: Jane Smith

Room Number []:

Work Phone []:

Home Phone []:

Other []:

Is the information correct? [Y/n] Y

“`

За да добавите съществуващ потребител към група неинтерактивно с `adduser`:

“`bash

adduser customuser sudo

“`

Това е забележителна функция: `adduser` служи и като инструмент за управление на членство в групи, което `useradd` не може да повтори с една команда.

Сравнение едно до друго

Функция`useradd``adduser`
ТипДвоичен файл (C програма)Скрипт (Perl при Debian, символна връзка при RHEL)
ИнтерактивностНеинтерактивен; всички опции чрез флаговеИнтерактивни подкани по подразбиране
Домашна директорияНе се създава, освен ако не е подаден `-m` (Debian)Създава се автоматично
Задаване на паролаИзисква отделна команда `passwd`Заявява се по време на създаването
GECOS полетаЗадават се чрез флага `-c` като единичен низСъбират се поле по поле интерактивно
Skeleton файловеКопират се само с флага `-m`Винаги се копират
Конфигурационен файл`/etc/login.defs`, `/etc/default/useradd``/etc/adduser.conf`
Наличност между дистрибуцииВсички Linux дистрибуцииСамо Debian/Ubuntu (като скрипт-обвивка)
Пригодност за скриптиранеОтлична — напълно неинтерактивнаЛоша — изисква флаговете `–disabled-password` и `–gecos` за избягване на подкани
Системни акаунтиПоддържани чрез флага `-r`Поддържани чрез флага `–system`
Управление на групиСамо по време на създаванетоМоже да добавя потребител към съществуваща група след създаването
ДетайлностПълен контрол над всеки параметърМнителни настройки по подразбиране, по-малко детайлен

Кога да използвате useradd

Автоматизация и Infrastructure-as-Code

`useradd` е правилният избор в неинтерактивен контекст: Ansible playbooks, Terraform provisioners, Docker инструкции `RUN`, cloud-init скриптове и CI/CD pipeline-и. Произвежда детерминистичен изход без зависимост от stdin.

“`bash

Ansible task equivalent

useradd -m -s /bin/bash -G sudo -c "Deploy User" deployuser

echo "deployuser:$(openssl passwd -6 'securepassword')" | chpasswd

“`

Преносимост между дистрибуции

Всеки shell скрипт, предназначен да работи както на системи, базирани на Debian, така и на RHEL, трябва да използва `useradd`. Разчитането на поведението на `adduser` ще доведе до безшумни грешки или неочаквано поведение при CentOS, Fedora, Rocky Linux или Alpine Linux.

Системни и сервизни акаунти

Създаването на заключени, без вход за влизане сервизни акаунти за демони е специалност на `useradd`:

“`bash

useradd -r -s /usr/sbin/nologin -d /var/lib/myservice -m myservice

“`

Флагът `-r` задава UID под прага за системни акаунти, сигнализира на администраторите, че това не е акаунт на човек, и е стандартният модел за разгръщане на приложения в среди за VPS Хостинг, където изолацията на услугите е критична.

Прецизен контрол на UID/GID

В NFS среди, оркестрация на контейнери или при синхронизиране на потребителски бази данни между множество сървъри, последователните UID и GID са задължителни. `useradd -u 1500 -g 1500` гарантира това; `adduser` не предлага същия детерминистичен контрол без значителна конфигурация.

Кога да използвате adduser

Интерактивна настройка на сървър

При ръчно осигуряване на нов Dedicated Server и добавяне на първите няколко потребителски акаунта на хора, `adduser` намалява риска от непълна настройка. Насочените подкани правят почти невъзможно да се забрави стъпката за паролата.

Среди с Debian/Ubuntu и стандартни настройки по подразбиране

Ако цялата ви инфраструктура работи с Debian или Ubuntu и създавате стандартни потребители с домашна директория, `adduser` произвежда правилни резултати по-бързо с по-малко флагове за запомняне.

Управление на групи след създаването

Синтаксисът `adduser username groupname` за добавяне на съществуващ потребител към съществуваща група е по-чист от `usermod -aG groupname username`, въпреки че и двата са валидни.

Въвеждане на младши администратори

Интерактивният характер на `adduser` го прави по-добър инструмент за обучение. Той показва важните полета (парола, пълно име) и скрива сложността на UID диапазоните и skeleton директориите, докато администраторът не е готов да ги научи.

Критични гранични случаи и клопки

Капанът с липсващата домашна директория

При Debian/Ubuntu, изпълнението на `useradd username` без `-m` създава потребителя, но не и домашната директория. Потребителят може да влезе (след като бъде зададена парола), но `$HOME` няма да съществува, причинявайки грешки в приложения, които записват в домашната директория при първо влизане — включително `.bash_history`, `.ssh/authorized_keys` и много директории за конфигурация на приложения.

“`bash

Verify home directory existence after creation

ls -la /home/newuser || echo "Home directory missing — run: mkhomedir_helper newuser"

“`

Заключване на shadow файла

И двете команди заключват `/etc/shadow` по време на записване. При скриптове за осигуряване с висока конкурентност, създаващи десетки потребители едновременно, това причинява race conditions. Използвайте опашка или последователно изпълнение при масово създаване на потребители.

Колизия на UID в контейнеризирани среди

При разгръщане на приложения на VPS с cPanel или други среди с контролен панел, самият панел управлява разпределението на UID. Ръчното изпълнение на `useradd` с твърдо кодиран UID може да се сблъска с UID, разпределени от панела, причинявайки грешки в разрешенията за множество акаунти. Винаги проверявайте `getent passwd | awk -F: '{print $3}' | sort -n` преди ръчно задаване на UID.

adduser –disabled-password за скриптиране

Ако трябва да използвате `adduser` в скрипт (например за да използвате неговите настройки по подразбиране за `/etc/adduser.conf`), потиснете интерактивните подкани:

“`bash

adduser –disabled-password –gecos "Automated User,,," scriptuser

echo "scriptuser:$(openssl passwd -6 'password')" | chpasswd

“`

Флагът `–gecos` приема низ, разделен със запетая, съответстващ на GECOS полетата, елиминирайки всички интерактивни подкани.

Интеграция с PAM и NSS

Нито `useradd`, нито `adduser` конфигурира PAM модули или NSS (Name Service Switch) записи за LDAP, Active Directory или други централизирани системи за удостоверяване. На сървъри, интегрирани с `sssd` или `winbind`, локалното създаване на потребители с която и да е команда създава акаунти, които могат да влязат в конфликт или да бъдат заменени от акаунти на директорийни услуги. Проверете `/etc/nsswitch.conf` преди създаване на локални потребители на системи, присъединени към домейн.

Персонализиране на skeleton файлове

И двете команди копират от `/etc/skel` по подразбиране. За екипи, управляващи среди за Споделен Уеб Хостинг, където всеки потребител се нуждае от предварително конфигуриран `.bashrc`, `.vimrc` или SSH конфигурация, попълването на `/etc/skel` преди изпълнение на която и да е команда е правилният подход — не модифицирането на файлове след създаването на акаунта.

Проверка на създаването на потребител

Независимо коя команда използвате, проверете резултата:

“`bash

Check passwd entry

getent passwd newuser

Check shadow entry (requires root)

getent shadow newuser

Check group memberships

groups newuser

id newuser

Verify home directory and permissions

ls -la /home/newuser

Test login shell

su -s /bin/bash – newuser -c "echo login successful"

“`

Промяна и изтриване на потребители

`useradd` и `adduser` само създават акаунти. Управлението след създаването използва различни команди:

  • `usermod` — Промяна на съществуващи атрибути на потребителя (обвивка, групи, домашна директория, изтичане).
  • `userdel` / `deluser` — Премахване на акаунти. `deluser –remove-home username` при Debian също премахва домашната директория и пощенската опашка.
  • `passwd` — Задаване или промяна на пароли, заключване/отключване на акаунти.
  • `chage` — Управление на политики за остаряване и изтичане на пароли.

“`bash

Lock an account without deleting it

usermod -L username

Unlock

usermod -U username

Force password change on next login

chage -d 0 username

“`

Практическа матрица за вземане на решения

Използвайте този контролен списък, за да изберете правилната команда:

  • Скриптът работи ли на система, различна от Debian, или трябва да е преносим? Използвайте `useradd`.
  • Това автоматизирана, неинтерактивна среда ли е (CI/CD, Ansible, Docker)? Използвайте `useradd`.
  • Нуждаете ли се от конкретен UID/GID за NFS или последователност на контейнери? Използвайте `useradd -u -g`.
  • Създавате ли системен/сервизен акаунт без обвивка за вход? Използвайте `useradd -r -s /usr/sbin/nologin`.
  • Работите ли с Debian/Ubuntu и създавате стандартен потребителски акаунт на човек интерактивно? Използвайте `adduser`.
  • Искате ли да добавите съществуващ потребител към група с чист едноредов команден ред? Използвайте `adduser username groupname`.
  • Пишете ли документация или обучавате младши персонал на Debian? Използвайте `adduser`.
  • Трябва ли да персонализирате местоположението на домашната директория, изтичането или обвивката неинтерактивно в мащаб? Използвайте `useradd` с изрични флагове.

Правилната хигиена на потребителските акаунти е в основата на сигурността на сървъра. Независимо дали управлявате единичен VPS или парк от Dedicated Servers, разбирането на точно това, което всяка команда записва на диска — и какво оставя незададено — предотвратява класа от ескалации на привилегии и грешки при удостоверяване, произтичащи от непълно осигуряване на акаунти.

ЧЗВ

Създава ли useradd домашна директория по подразбиране?

Зависи от дистрибуцията. При системи, базирани на Red Hat (RHEL, CentOS, Rocky Linux), `CREATE_HOME yes` в `/etc/login.defs` кара `useradd` да създава домашната директория автоматично. При Debian и Ubuntu не се създава домашна директория, освен ако изрично не подадете флага `-m`.

Наличен ли е adduser на CentOS или Rocky Linux?

При дистрибуции, базирани на RHEL, `adduser` е символна връзка към `useradd`, а не интерактивната Perl обвивка, намираща се при Debian/Ubuntu. Изпълнението на `adduser username` на CentOS се държи идентично с `useradd username` — без подкани, без автоматична домашна директория при настройките по подразбиране в стил Debian.

Как да използвам adduser неинтерактивно в скрипт?

Подайте `–disabled-password` за пропускане на подканата за парола и `–gecos ""` за пропускане на подканите за GECOS полета: `adduser –disabled-password –gecos "" username`. Задайте паролата след това с `echo "username:password" | chpasswd` или чрез подаване на хеш `openssl passwd -6`.

Каква е разликата между /etc/login.defs и /etc/adduser.conf?

`/etc/login.defs` е системният конфигурационен файл, четен от `useradd`, `userdel` и `usermod` — той контролира диапазоните на UID/GID, настройките по подразбиране за остаряване на паролата и поведението при създаване на домашна директория. `/etc/adduser.conf` се чете изключително от Perl скриптовете `adduser` и `deluser` при системи, базирани на Debian, и контролира настройки от по-високо ниво като обвивката по подразбиране, родителския път на домашната директория и skeleton директорията.

Мога ли безопасно да смесвам useradd и adduser на един и същи Debian сървър?

Да. И двете в крайна сметка записват в едни и същи файлове `/etc/passwd`, `/etc/shadow` и `/etc/group`. Акаунтите, създадени с която и да е команда, са неразличими на системно ниво. Единственото практическо притеснение е последователността: ако екипът ви използва `adduser` интерактивно, а скрипт за автоматизация използва `useradd` без `-m`, може да се окаже, че някои потребители нямат домашни директории. Стандартизирайте един подход за всяка среда и го документирайте.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало