useradd vs adduser: Perbedaan Teknis, Kasus Penggunaan, dan Kapan Menggunakan Masing-Masing
`useradd` adalah utilitas biner tingkat rendah yang tersedia di hampir setiap distribusi Linux yang membuat akun pengguna dengan langsung menulis ke `/etc/passwd`, `/etc/shadow`, dan `/etc/group`. `adduser` adalah skrip wrapper tingkat lebih tinggi — biasanya ditulis dalam Perl pada sistem berbasis Debian — yang memanggil `useradd` secara internal sambil mengotomatiskan pembuatan direktori home, pengisian file skeleton, permintaan kata sandi, dan pengumpulan field GECOS. Perbedaan praktisnya bukan hanya soal ergonomi: memilih alat yang salah dalam pipeline provisi otomatis atau pada sistem non-Debian dapat menghasilkan akun pengguna yang tidak lengkap secara diam-diam.
Kedua perintah pada akhirnya mendaftarkan pengguna dalam database autentikasi sistem, tetapi perilakunya berbeda secara signifikan dalam hal default, interaktivitas, portabilitas, dan kemampuan skrip. Panduan ini mencakup setiap perbedaan teknis yang dibutuhkan administrator untuk membuat keputusan yang tepat.
Apa yang Sebenarnya Dilakukan useradd di Balik Layar
`useradd` adalah bagian dari paket shadow-utils (kadang disebut `passwd` pada distribusi lama). Saat dipanggil, ia melakukan serangkaian operasi atomik:
- Membaca `/etc/login.defs` untuk menentukan rentang UID default, kebijakan penuaan kata sandi, dan apakah akan membuat direktori home secara default.
- Membaca `/etc/default/useradd` untuk shell default, jalur direktori skeleton, dan perilaku grup.
- Menulis entri baru ke `/etc/passwd` dan `/etc/shadow`.
- Secara opsional membuat direktori home dan menyalin file dari `/etc/skel` jika `-m` diteruskan secara eksplisit.
- Secara opsional membuat grup privat yang sesuai dengan nama pengguna jika `USERGROUPS_ENAB` diatur ke `yes` di `/etc/login.defs`.
Poin penting yang sering diabaikan banyak panduan: pada distribusi berbasis Red Hat (RHEL, CentOS, Rocky Linux, AlmaLinux), `useradd` membuat direktori home secara default karena `/etc/login.defs` menetapkan `CREATE_HOME yes`. Pada Debian dan Ubuntu, hal ini tidak terjadi — flag `-m` wajib digunakan kecuali Anda memodifikasi `/etc/default/useradd`. Asimetri perilaku ini sering menjadi sumber kebingungan ketika administrator berpindah antar keluarga distribusi.
Flag Utama dan Perilakunya
| Flag | Tujuan | Catatan |
|---|---|---|
| —— | ——— | ——- |
| `-m` | Buat direktori home | Wajib pada Debian/Ubuntu tanpa perubahan konfigurasi |
| `-d /path` | Tetapkan jalur direktori home kustom | Tidak membuat direktori kecuali `-m` juga digunakan |
| `-s /bin/bash` | Tetapkan shell login | Default ke `/bin/sh` atau nilai di `/etc/default/useradd` |
| `-u UID` | Tetapkan UID tertentu | Harus unik; gunakan `-o` untuk mengizinkan duplikat |
| `-g GID` | Tetapkan grup utama | Grup harus sudah ada |
| `-G group1,group2` | Tambahkan grup tambahan | Dipisahkan koma, tanpa spasi |
| `-e YYYY-MM-DD` | Tanggal kedaluwarsa akun | Ditulis ke field 8 `/etc/shadow` |
| `-f days` | Periode tidak aktif kata sandi | Hari setelah kedaluwarsa sebelum akun dikunci |
| `-r` | Buat akun sistem | UID di bawah `SYS_UID_MAX` di `/etc/login.defs`, tidak ada direktori home secara default |
| `-M` | Secara eksplisit tidak membuat direktori home | Mengesampingkan default distro |
| `-N` | Tidak membuat grup privat pengguna | Grup utama pengguna menjadi grup default |
| `-k /path` | Tentukan direktori skeleton alternatif | Mengesampingkan `/etc/skel` |
Contoh Praktis useradd dengan Opsi Lengkap
“`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
“`
Tidak ada kata sandi yang ditetapkan sampai `passwd` dipanggil. Sampai saat itu, akun ada tetapi terkunci — entri shadow berisi `!` sebagai hash kata sandi, mencegah login melalui autentikasi kata sandi. Namun, login berbasis kunci SSH tidak terpengaruh oleh kondisi ini.
Apa yang Sebenarnya Dilakukan adduser di Balik Layar
Pada Debian dan Ubuntu, `adduser` adalah skrip Perl yang berlokasi di `/usr/sbin/adduser`. Ia membaca konfigurasinya sendiri dari `/etc/adduser.conf` — file terpisah dari `/etc/login.defs` — dan kemudian memanggil `useradd` dengan flag yang sesuai berdasarkan konfigurasi tersebut ditambah input pengguna.
Skrip ini melakukan langkah-langkah tambahan yang tidak dilakukan `useradd` saja:
- Meminta kata sandi secara interaktif dan mengonfirmasinya dengan entri kedua.
- Mengumpulkan field GECOS (nama lengkap, nomor ruangan, telepon kerja, telepon rumah, lainnya) melalui prompt terpandu.
- Menyalin file skeleton dari `/etc/skel` secara otomatis tanpa memerlukan `-m`.
- Menetapkan kepemilikan dan izin yang benar pada direktori home.
- Secara opsional menambahkan pengguna ke grup tambahan yang didefinisikan di `/etc/adduser.conf`.
Pada sistem berbasis Red Hat, `adduser` biasanya merupakan symlink ke `useradd`, artinya berperilaku identik dengan biner tingkat rendah — tidak ada wrapper interaktif. Ini adalah masalah portabilitas terpenting saat menulis skrip lintas distribusi.
File Konfigurasi adduser: /etc/adduser.conf
Direktif utama di `/etc/adduser.conf` yang memengaruhi perilaku:
“`
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)"
“`
Memodifikasi file ini memungkinkan Anda menstandarisasi pembuatan pengguna di seluruh armada server Debian/Ubuntu tanpa harus meneruskan flag setiap saat.
Contoh Praktis adduser
“`bash
adduser customuser
“`
Sesi interaktif terlihat seperti ini:
“`
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
“`
Untuk menambahkan pengguna yang sudah ada ke grup secara non-interaktif dengan `adduser`:
“`bash
adduser customuser sudo
“`
Ini adalah fitur yang patut diperhatikan: `adduser` berfungsi ganda sebagai alat manajemen keanggotaan grup, yang tidak dapat direplikasi `useradd` dalam satu perintah.
Perbandingan Berdampingan
| Fitur | `useradd` | `adduser` |
|---|---|---|
| — | — | — |
| Tipe | Biner (program C) | Skrip (Perl pada Debian, symlink pada RHEL) |
| Interaktivitas | Non-interaktif; semua opsi melalui flag | Prompt interaktif secara default |
| Direktori home | Tidak dibuat kecuali `-m` diteruskan (Debian) | Dibuat secara otomatis |
| Pengaturan kata sandi | Memerlukan perintah `passwd` terpisah | Diminta selama pembuatan |
| Field GECOS | Ditetapkan melalui flag `-c` sebagai satu string | Dikumpulkan field per field secara interaktif |
| File skeleton | Disalin hanya dengan flag `-m` | Selalu disalin |
| File konfigurasi | `/etc/login.defs`, `/etc/default/useradd` | `/etc/adduser.conf` |
| Ketersediaan lintas distro | Semua distribusi Linux | Hanya Debian/Ubuntu (sebagai skrip wrapper) |
| Kesesuaian untuk skrip | Sangat baik — sepenuhnya non-interaktif | Buruk — memerlukan flag `–disabled-password` dan `–gecos` untuk menghindari prompt |
| Akun sistem | Didukung melalui flag `-r` | Didukung melalui flag `–system` |
| Manajemen grup | Hanya saat pembuatan | Dapat menambahkan pengguna ke grup yang sudah ada setelah pembuatan |
| Granularitas | Kontrol penuh atas setiap parameter | Default yang opinionated, kurang granular |
Kapan Menggunakan useradd
Otomasi dan Infrastructure-as-Code
`useradd` adalah pilihan yang tepat dalam konteks non-interaktif apa pun: playbook Ansible, provisioner Terraform, instruksi Docker `RUN`, skrip cloud-init, dan pipeline CI/CD. Ini menghasilkan output deterministik tanpa ketergantungan stdin.
“`bash
Ansible task equivalent
useradd -m -s /bin/bash -G sudo -c "Deploy User" deployuser
echo "deployuser:$(openssl passwd -6 'securepassword')" | chpasswd
“`
Portabilitas Lintas Distribusi
Skrip shell apa pun yang dimaksudkan untuk berjalan pada sistem berbasis Debian maupun RHEL harus menggunakan `useradd`. Mengandalkan perilaku `adduser` akan menghasilkan kegagalan diam-diam atau perilaku tak terduga pada CentOS, Fedora, Rocky Linux, atau Alpine Linux.
Akun Sistem dan Layanan
Membuat akun layanan terkunci tanpa shell login untuk daemon adalah keahlian `useradd`:
“`bash
useradd -r -s /usr/sbin/nologin -d /var/lib/myservice -m myservice
“`
Flag `-r` menetapkan UID di bawah ambang batas akun sistem, memberi sinyal kepada administrator bahwa ini bukan akun pengguna manusia, dan merupakan pola standar untuk penerapan aplikasi di lingkungan VPS Hosting di mana isolasi layanan sangat penting.
Kontrol UID/GID yang Tepat
Dalam lingkungan NFS, orkestrasi container, atau saat menyinkronkan database pengguna di beberapa server, UID dan GID yang konsisten adalah wajib. `useradd -u 1500 -g 1500` menjamin hal ini; `adduser` tidak menawarkan kontrol deterministik yang sama tanpa konfigurasi yang signifikan.
Kapan Menggunakan adduser
Pengaturan Server Interaktif
Saat menyediakan Dedicated Server baru secara manual dan menambahkan beberapa akun pengguna manusia pertama, `adduser` mengurangi risiko pengaturan yang tidak lengkap. Prompt terpandu membuatnya hampir tidak mungkin untuk melupakan langkah kata sandi.
Lingkungan Debian/Ubuntu dengan Default Standar
Jika seluruh infrastruktur Anda menjalankan Debian atau Ubuntu dan Anda membuat pengguna direktori home standar, `adduser` menghasilkan hasil yang benar lebih cepat dengan lebih sedikit flag yang perlu diingat.
Manajemen Grup Pasca-Pembuatan
Sintaks `adduser username groupname` untuk menambahkan pengguna yang sudah ada ke grup yang sudah ada lebih bersih daripada `usermod -aG groupname username`, meskipun keduanya valid.
Orientasi Administrator Junior
Sifat interaktif `adduser` menjadikannya alat pengajaran yang lebih baik. Ini menampilkan field yang penting (kata sandi, nama lengkap) dan menyembunyikan kompleksitas rentang UID dan direktori skeleton sampai administrator siap mempelajarinya.
Kasus Edge Kritis dan Jebakan
Jebakan Direktori Home yang Hilang
Pada Debian/Ubuntu, menjalankan `useradd username` tanpa `-m` membuat pengguna tetapi bukan direktori home. Pengguna dapat login (setelah kata sandi ditetapkan), tetapi `$HOME` tidak akan ada, menyebabkan kegagalan pada aplikasi apa pun yang menulis ke direktori home saat login pertama — termasuk `.bash_history`, `.ssh/authorized_keys`, dan banyak direktori konfigurasi aplikasi.
“`bash
Verify home directory existence after creation
ls -la /home/newuser || echo "Home directory missing — run: mkhomedir_helper newuser"
“`
Penguncian File Shadow
Kedua perintah mengunci `/etc/shadow` selama penulisan. Dalam skrip provisi konkurensi tinggi yang membuat puluhan pengguna secara bersamaan, ini menyebabkan kondisi balapan. Gunakan antrian atau eksekusi berurutan saat membuat pengguna secara massal.
Tabrakan UID di Lingkungan Terkontainerisasi
Saat menerapkan aplikasi pada VPS dengan cPanel atau lingkungan panel kontrol lainnya, panel itu sendiri mengelola alokasi UID. Menjalankan `useradd` secara manual dengan UID yang dikodekan keras dapat bertabrakan dengan UID yang ditetapkan panel, menyebabkan kesalahan izin di beberapa akun. Selalu periksa `getent passwd | awk -F: '{print $3}' | sort -n` sebelum menentukan UID secara manual.
adduser –disabled-password untuk Skrip
Jika Anda harus menggunakan `adduser` dalam skrip (misalnya, untuk memanfaatkan default `/etc/adduser.conf`-nya), tekan prompt interaktif:
“`bash
adduser –disabled-password –gecos "Automated User,,," scriptuser
echo "scriptuser:$(openssl passwd -6 'password')" | chpasswd
“`
Flag `–gecos` menerima string yang dipisahkan koma yang sesuai dengan field GECOS, menghilangkan semua prompt interaktif.
Integrasi PAM dan NSS
Baik `useradd` maupun `adduser` tidak mengonfigurasi modul PAM atau entri NSS (Name Service Switch) untuk LDAP, Active Directory, atau sistem autentikasi terpusat lainnya. Pada server yang terintegrasi dengan `sssd` atau `winbind`, pembuatan pengguna lokal dengan salah satu perintah membuat akun yang mungkin bertentangan dengan atau digantikan oleh akun layanan direktori. Verifikasi `/etc/nsswitch.conf` sebelum membuat pengguna lokal pada sistem yang bergabung dengan domain.
Kustomisasi File Skeleton
Kedua perintah menyalin dari `/etc/skel` secara default. Untuk tim yang mengelola lingkungan Shared Web Hosting di mana setiap pengguna membutuhkan `.bashrc`, `.vimrc`, atau konfigurasi SSH yang telah dikonfigurasi sebelumnya, mengisi `/etc/skel` sebelum menjalankan salah satu perintah adalah pendekatan yang benar — bukan memodifikasi file setelah pembuatan akun.
Memverifikasi Pembuatan Pengguna
Terlepas dari perintah mana yang Anda gunakan, verifikasi hasilnya:
“`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"
“`
Memodifikasi dan Menghapus Pengguna
`useradd` dan `adduser` hanya membuat akun. Manajemen pasca-pembuatan menggunakan perintah yang berbeda:
- `usermod` — Memodifikasi atribut pengguna yang sudah ada (shell, grup, direktori home, kedaluwarsa).
- `userdel` / `deluser` — Menghapus akun. `deluser –remove-home username` pada Debian juga menghapus direktori home dan spool surat.
- `passwd` — Menetapkan atau mengubah kata sandi, mengunci/membuka kunci akun.
- `chage` — Mengelola kebijakan penuaan dan kedaluwarsa kata sandi.
“`bash
Lock an account without deleting it
usermod -L username
Unlock
usermod -U username
Force password change on next login
chage -d 0 username
“`
Matriks Keputusan Praktis
Gunakan daftar periksa ini untuk memilih perintah yang tepat:
- Apakah skrip berjalan pada sistem non-Debian atau perlu portabel? Gunakan `useradd`.
- Apakah ini lingkungan otomatis non-interaktif (CI/CD, Ansible, Docker)? Gunakan `useradd`.
- Apakah Anda memerlukan UID/GID tertentu untuk konsistensi NFS atau container? Gunakan `useradd -u -g`.
- Apakah Anda membuat akun sistem/layanan tanpa shell login? Gunakan `useradd -r -s /usr/sbin/nologin`.
- Apakah Anda menggunakan Debian/Ubuntu, membuat akun pengguna manusia standar secara interaktif? Gunakan `adduser`.
- Apakah Anda ingin menambahkan pengguna yang sudah ada ke grup dengan satu baris perintah yang bersih? Gunakan `adduser username groupname`.
- Apakah Anda menulis dokumentasi atau melatih staf junior di Debian? Gunakan `adduser`.
- Apakah Anda perlu menyesuaikan lokasi direktori home, kedaluwarsa, atau shell secara non-interaktif dalam skala besar? Gunakan `useradd` dengan flag eksplisit.
Kebersihan akun pengguna yang tepat adalah fondasi keamanan server. Baik Anda mengelola satu VPS maupun armada Dedicated Server, memahami dengan tepat apa yang ditulis setiap perintah ke disk — dan apa yang dibiarkan tidak ditetapkan — mencegah kelas eskalasi hak istimewa dan kegagalan autentikasi yang berasal dari provisi akun yang tidak lengkap.
—
FAQ
Apakah useradd membuat direktori home secara default?
Tergantung pada distribusinya. Pada sistem berbasis Red Hat (RHEL, CentOS, Rocky Linux), `CREATE_HOME yes` di `/etc/login.defs` menyebabkan `useradd` membuat direktori home secara otomatis. Pada Debian dan Ubuntu, tidak ada direktori home yang dibuat kecuali Anda secara eksplisit meneruskan flag `-m`.
Apakah adduser tersedia di CentOS atau Rocky Linux?
Pada distribusi berbasis RHEL, `adduser` adalah tautan simbolik ke `useradd`, bukan wrapper Perl interaktif yang ditemukan di Debian/Ubuntu. Menjalankan `adduser username` di CentOS berperilaku identik dengan `useradd username` — tidak ada prompt, tidak ada direktori home otomatis pada default gaya Debian.
Bagaimana cara menggunakan adduser secara non-interaktif dalam skrip?
Teruskan `–disabled-password` untuk melewati prompt kata sandi dan `–gecos ""` untuk melewati prompt field GECOS: `adduser –disabled-password –gecos "" username`. Tetapkan kata sandi setelahnya dengan `echo "username:password" | chpasswd` atau dengan menyalurkan hash `openssl passwd -6`.
Apa perbedaan antara /etc/login.defs dan /etc/adduser.conf?
`/etc/login.defs` adalah file konfigurasi seluruh sistem yang dibaca oleh `useradd`, `userdel`, dan `usermod` — ini mengontrol rentang UID/GID, default penuaan kata sandi, dan perilaku pembuatan direktori home. `/etc/adduser.conf` dibaca secara eksklusif oleh skrip Perl `adduser` dan `deluser` pada sistem berbasis Debian dan mengontrol default tingkat lebih tinggi seperti shell default, jalur induk direktori home, dan direktori skeleton.
Dapatkah saya dengan aman mencampur useradd dan adduser pada server Debian yang sama?
Ya. Keduanya pada akhirnya menulis ke file `/etc/passwd`, `/etc/shadow`, dan `/etc/group` yang sama. Akun yang dibuat dengan salah satu perintah tidak dapat dibedakan di tingkat sistem. Satu-satunya kekhawatiran praktis adalah konsistensi: jika tim Anda menggunakan `adduser` secara interaktif dan skrip otomasi menggunakan `useradd` tanpa `-m`, Anda mungkin berakhir dengan beberapa pengguna yang tidak memiliki direktori home. Standarisasi pada satu pendekatan per lingkungan dan dokumentasikan.
