Ubuntu 提供兩個創建用戶命令:底層 useradd 與友好封裝 adduser。本文深度對比參數、行為差異、適用場景,助你選擇正確工具。
| 特性 | useradd | adduser |
|---|---|---|
| 家目錄創建 | 需 -m 參數 | 默認自動創建 |
| 交互體驗 | 無交互、需參數完整 | 交互式提示密碼、全名、電話等 |
| 默認 Shell | /bin/sh | /bin/bash |
| 骨架目錄 | 需 -k 指定 | 自動複製 /etc/skel |
| 腳本適用性 | ✅ 適合自動化 | ❌ 交互式阻塞腳本 |
| 群組處理 | 需 -G 手動指定 | 自動創建同名群組、加入 |
| 密碼設置 | 需 passwd 另行設置 | 交互式同步設置 |
# 最小化創建 (無家目錄、無密碼、sh shell)
sudo useradd testuser1
# 結果:/etc/passwd 有用戶,/home 無目錄,/etc/shadow 密碼欄為 !
# 完整創建 (推薦腳本用法)
sudo useradd -m -s /bin/bash -G sudo -c "Test User" testuser2
sudo echo "testuser2:Password123" | sudo chpasswd
# -m 創建家目錄
# -s 指定 shell
# -G 加入附屬群組
# -c 註釋 (全名)
$ sudo adduser testuser3
Adding user `testuser3' ...
Adding new group `testuser3' (1002) ...
Adding new user `testuser3' (1002) with group `testuser3' ...
Creating home directory `/home/testuser3' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for testuser3
Enter the new value, or press ENTER for the default
Full Name []: Test User
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
# useradd 等價於 adduser 的參數組合
sudo useradd -m -s /bin/bash -G sudo -c "Full Name" username
sudo passwd username # 另行設置密碼
# adduser 內部實際調用 useradd + chfn + passwd
| 場景 | 推薦命令 | 理由 |
|---|---|---|
| 手動創建單用戶 | adduser | 交互友好、自動處理細節、不易出錯 |
| 腳本批量創建用戶 | useradd | 非交互、參數化、可編程控制 |
| 臨時服務帳號 | useradd -r -s /usr/sbin/nologin | 系統用戶、無登錄、無家目錄 |
| Dockerfile 創建用戶 | useradd | 構建過程無交互終端 |
| LDAP/AD 同步腳本 | useradd | 程序化控制屬性 |
# /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
# /etc/adduser.conf
DSHELL=/bin/bash
DHOME=/home
SKEL=/etc/skel
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
FIRST_SYSTEM_GID=100
LAST_SYSTEM_GID=999
# 使用 --gecos 預填信息,--disabled-password 禁用密碼提示
sudo adduser --gecos "Full Name,,," --disabled-password username
# 仍會創建家目錄、複製 skel、創建同名群組
# 後續需手動設置密碼:sudo passwd username
adduser 會卡死等待輸入useradd 忘記 -m 導致無家目錄、登錄報錯useradd + 參數完整指定adduser 享受交互便利理解雙命令設計哲學:useradd 為機器服務,adduser 為人服務。按場景選擇,事半功倍。