Linux adduser 命令详解

简介: adduser 命令是一个交互式的用户管理工具,用于在 Linux 系统中创建新的用户账户。它会自动创建用户主目录、复制默认配置文件并设置用户环境。

命令概述

adduser 是一个用户友好的用户创建工具,相比 useradd 命令,它提供了更简单的交互式界面和更完整的默认配置。adduser 会自动设置用户主目录、默认 shell、用户组等,使新用户创建过程更加便捷。

主要特点
  • 交互式用户创建
  • 自动创建主目录
  • 复制默认配置文件
  • 自动设置用户组
  • 友好的错误提示
与 useradd 对比
  • adduser: 交互式,用户友好,自动完成更多设置
  • useradd: 非交互式,需要更多参数,更灵活

安装 adduser

大多数 Linux 发行版默认已经安装 adduser。如果没有,可以使用以下命令安装:

Debian/Ubuntu 系统

# 通常已预装,如果需要重新安装
sudo apt install adduser

RHEL/CentOS/Fedora 系统

注意:RHEL/CentOS 系统通常使用 useradd 命令,但可以通过 shadow-utils 包获得类似功能:

# 安装相关工具
sudo yum install shadow-utils

语法格式

# 基本语法
adduser [选项] 用户名

# 添加系统用户
adduser --system [选项] 用户名

# 添加用户到指定组
adduser 用户名 组名

参数说明:

  • 用户名 - 要创建的新用户的登录名
  • 组名 - 将用户添加到的现有组名(可选)

常用选项

选项 说明
--home 目录 指定用户主目录
--shell SHELL 指定用户的登录shell
--ingroup 组名 指定用户的主要组
--disabled-login 创建后立即禁用账户
--disabled-password 创建无密码账户
--gecos "描述" 设置用户描述信息(全名等)
--quiet 安静模式,减少输出
--system 创建系统用户(无主目录)
--force-badname 允许使用非常规用户名
--uid UID 指定用户ID
--gid GID 指定组ID
--help 显示帮助信息

使用示例

示例1:基本使用 - 创建普通用户

# 交互式创建用户
sudo adduser john

# 交互过程示例:
# Adding user `john' ...
# Adding new group `john' (1002) ...
# Adding new user `john' (1002) with group `john' ...
# Creating home directory `/home/john' ...
# Copying files from `/etc/skel' ...
# Enter new UNIX password:
# Retype new UNIX password:
# passwd: password updated successfully
# Changing the user information for john
# Enter the new value, or press ENTER for the default
# 	Full Name []: John Smith
# 	Room Number []: 101
# 	Work Phone []: 555-1234
# 	Home Phone []: 555-5678
# 	Other []: Developer
# Is the information correct? [Y/n] Y

示例2:非交互式创建用户

# 使用选项一次性创建用户
sudo adduser --home /home/john \
             --shell /bin/bash \
             --gecos "John Smith,Developer,555-1234" \
             john

# 设置密码(交互式)
sudo passwd john

# 或使用chpasswd
echo "john:password123" | sudo chpasswd

示例3:创建系统用户

# 创建系统用户(通常用于服务账户)
sudo adduser --system \
             --no-create-home \
             --shell /usr/sbin/nologin \
             nginx-user

# 验证系统用户
id nginx-user
# 输出:uid=113(nginx-user) gid=117(nginx-user) groups=117(nginx-user)

示例4:创建用户并指定组

# 首先创建组(如果不存在)
sudo groupadd developers

# 创建用户并指定主组
sudo adduser --ingroup developers \
             --shell /bin/bash \
             --gecos "Jane Doe" \
             jane

# 同时将用户添加到其他组
sudo adduser jane sudo      # 添加到sudo组
sudo adduser jane docker    # 添加到docker组
sudo adduser jane www-data  # 添加到www-data组

# 验证用户组
groups jane
# 输出:jane : developers sudo docker www-data

示例5:创建禁用账户

# 创建无密码账户(用于特定用途)
sudo adduser --disabled-password \
             --gecos "Service Account" \
             service-user

# 创建后立即禁用账户
sudo adduser --disabled-login \
             --shell /usr/sbin/nologin \
             backup-user

# 创建账户但不允许登录
sudo adduser --shell /sbin/nologin \
             --no-create-home \
             restricted-user

示例6:批量创建用户

#!/bin/bash
# 批量创建用户脚本
USER_FILE="users.txt"
PASSWORD="default123"

# 用户文件格式:用户名:全名:组名:描述
# john:John Smith:developers:Senior Developer
# jane:Jane Doe:developers:Junior Developer

while IFS=':' read -r username fullname group description; do
    echo "创建用户: $username"

    # 创建组(如果不存在)
    if ! getent group "$group" > /dev/null; then
        sudo groupadd "$group"
    fi

    # 创建用户
    sudo adduser --ingroup "$group" \
                 --gecos "$fullname,,,$description" \
                 --disabled-password \
                 "$username"

    # 设置密码
    echo "$username:$PASSWORD" | sudo chpasswd

    # 强制用户首次登录修改密码
    sudo passwd --expire "$username"

    echo "用户 $username 创建完成"
done < "$USER_FILE"

相关配置文件

配置文件 说明 用途
/etc/passwd 用户账户信息 存储用户基本信息(UID、GID、shell等)
/etc/shadow 用户密码信息 存储加密密码和密码策略
/etc/group 组信息 存储组定义和组成员
/etc/gshadow 组密码信息 存储组密码和管理信息
/etc/skel/ 骨架目录 创建用户时复制的默认配置文件
/etc/adduser.conf adduser配置 adduser命令的默认配置
/etc/login.defs 登录定义 用户创建的默认值(UID范围等)

/etc/skel/ 目录内容

# 查看骨架目录内容
ls -la /etc/skel/

# 典型内容:
# .bashrc     - Bash shell配置文件
# .profile    - 用户环境配置文件
# .bash_logout - 退出shell时执行的命令

# 自定义骨架目录
# 1. 创建自定义文件
echo "alias ll='ls -la'" > /etc/skel/.bash_aliases

# 2. 创建自定义配置文件
cat > /etc/skel/.vimrc << 'EOF'
syntax on
set tabstop=4
set shiftwidth=4
set expandtab
EOF

/etc/adduser.conf 配置示例

# /etc/adduser.conf - adduser配置文件

# 默认值
DSHELL=/bin/bash
DHOME=/home
GROUPHOMES=no
LETTERHOMES=no
SKEL=/etc/skel

# UID范围
FIRST_UID=1000
LAST_UID=29999

# GID范围
FIRST_GID=1000
LAST_GID=29999

# 用户创建选项
USERGROUPS=yes
DIR_MODE=0755
SETGID_HOME=no

# 密码设置
PASS_MIN_DAYS=0
PASS_MAX_DAYS=99999

# 默认用户配置
USERS_GID=100
ADD_EXTRA_GROUPS=0

用户管理流程

1 规划用户配置
# 确定用户名、组、权限
USERNAME="newuser"
PRIMARY_GROUP="developers"
SHELL="/bin/bash"
HOME_DIR="/home/$USERNAME"
2 创建用户
# 创建用户和主目录
sudo adduser --ingroup $PRIMARY_GROUP \
             --shell $SHELL \
             --home $HOME_DIR \
             $USERNAME
3 配置用户权限
# 设置密码
sudo passwd $USERNAME

# 添加到附加组
sudo adduser $USERNAME sudo
sudo adduser $USERNAME docker

# 设置目录权限
sudo chmod 750 $HOME_DIR

常见问题与故障排除

错误信息: adduser: The user `username' already exists.

解决方案:

# 1. 检查用户是否已存在
id username
getent passwd username

# 2. 如果存在,删除用户(如果需要)
sudo deluser username

# 3. 或者创建不同的用户名
sudo adduser username2

# 4. 检查用户残留文件
ls -la /home/ | grep username
ls -la /var/mail/ | grep username

错误信息: mkdir: cannot create directory '/home/username': Permission denied

解决方案:

# 1. 检查父目录权限
ls -ld /home/

# 2. 修复目录权限
sudo chmod 755 /home

# 3. 手动创建目录并设置权限
sudo mkdir /home/username
sudo chown username:username /home/username
sudo chmod 700 /home/username

# 4. 复制骨架文件
sudo cp -r /etc/skel/. /home/username/
sudo chown -R username:username /home/username

错误信息: passwd: Authentication token manipulation error

解决方案:

# 1. 检查密码复杂性要求
# 查看PAM配置
cat /etc/pam.d/common-password

# 2. 使用更强的密码
echo "username:StrongP@ssw0rd123" | sudo chpasswd

# 3. 检查磁盘空间
df -h /

# 4. 检查/etc/shadow权限
ls -l /etc/shadow
sudo chmod 640 /etc/shadow
sudo chown root:shadow /etc/shadow

# 5. 使用passwd命令交互式设置
sudo passwd username

高级用户管理

用户模板和自动化

#!/bin/bash
# 高级用户创建模板

create_user_with_profile() {
    local username=$1
    local fullname=$2
    local groups=$3

    # 创建用户
    sudo adduser --disabled-password \
                 --gecos "$fullname" \
                 "$username"

    # 设置随机密码
    local password=$(openssl rand -base64 12)
    echo "$username:$password" | sudo chpasswd

    # 添加到组
    IFS=',' read -ra group_array <<< "$groups"
    for group in "${group_array[@]}"; do
        sudo adduser "$username" "$group"
    done

    # 配置SSH密钥
    local ssh_dir="/home/$username/.ssh"
    sudo mkdir -p "$ssh_dir"
    sudo touch "$ssh_dir/authorized_keys"
    sudo chmod 700 "$ssh_dir"
    sudo chmod 600 "$ssh_dir/authorized_keys"
    sudo chown -R "$username:$username" "$ssh_dir"

    # 记录创建信息
    echo "用户: $username" >> /var/log/user_creation.log
    echo "密码: $password" >> /var/log/user_creation.log
    echo "组: $groups" >> /var/log/user_creation.log
    echo "---" >> /var/log/user_creation.log
}

# 使用模板创建用户
create_user_with_profile "alice" "Alice Wonderland" "sudo,developers,docker"

LDAP集成用户创建

# 创建LDAP兼容用户
sudo adduser --uid 10000 \
             --gid 10000 \
             --home /home/ldapuser \
             --shell /bin/bash \
             --gecos "LDAP User" \
             ldapuser

# 禁用本地密码验证
sudo passwd -l ldapuser

# 配置LDAP认证
sudo authconfig --enableldap \
                --enableldapauth \
                --ldapserver=ldap.example.com \
                --ldapbasedn="dc=example,dc=com" \
                --update

相关命令

useradd

低级用户添加

deluser

删除用户

usermod

修改用户

groupadd

添加组

passwd

密码管理

chage

密码策略

id

用户信息

whoami

当前用户