← Back

Add a sudo user

Creates a user with sudo rights and optionally installs a public key for it. Detects whether the admin group is called sudo or wheel.

Root required

One-line run

curl -fsSL https://www.moiu.cn/scripts/user-add.sh | bash

Source

#!/usr/bin/env bash
# 新建 sudo 用户
#
# 建一个带 sudo 权限的用户,可选把公钥一并写进它的 authorized_keys。
# 用法:bash user-add.sh <用户名> [公钥]

set -e

# 需要 root:下面的系统级改动都直接执行,不再逐条 sudo
if [ "$(id -u)" -ne 0 ]; then
    echo '[!] 这个脚本需要 root 权限,请用 sudo 重新运行:'
    echo '    curl -fsSL 脚本地址 | sudo bash'
    echo '    或已经下载到本地:sudo bash 本文件'
    exit 1
fi

NAME="$1"
KEY="$2"

if [ -z "$NAME" ]; then
    echo '用法:bash user-add.sh <用户名> [公钥]'
    exit 1
fi

case "$NAME" in
    *[!a-z0-9_-]*) echo "[!] 用户名只允许小写字母、数字、下划线、连字符:$NAME"; exit 1 ;;
esac

NAME_LEN=$(printf '%s' "$NAME" | wc -c)
if [ "$NAME_LEN" -gt 32 ]; then
    echo '[!] 用户名太长了(超过 32 个字符)'
    exit 1
fi

if id "$NAME" >/dev/null 2>&1; then
    echo "[!] 用户已存在:$NAME"
else
    useradd -m -s /bin/bash "$NAME"
    echo "[*] 已创建用户 $NAME"
fi

# sudo 组在 Debian / Ubuntu 上叫 sudo,RHEL 系叫 wheel
if getent group sudo >/dev/null 2>&1; then
    GROUP=sudo
else
    GROUP=wheel
fi
usermod -aG "$GROUP" "$NAME"
echo "[*] 已加入 $GROUP 组"

if [ -n "$KEY" ]; then
    HOME_DIR=$(getent passwd "$NAME" | cut -d: -f6)
    mkdir -p "$HOME_DIR/.ssh"
    printf '%s\n' "$KEY" >> "$HOME_DIR/.ssh/authorized_keys"
    chmod 700 "$HOME_DIR/.ssh"
    chmod 600 "$HOME_DIR/.ssh/authorized_keys"
    chown -R "$NAME":"$NAME" "$HOME_DIR/.ssh"
    echo "[*] 公钥已写入 $HOME_DIR/.ssh/authorized_keys"
fi

echo ''
echo "  用户:$NAME(组:$GROUP)"
echo '❗ 先确认能登录,再考虑关掉密码登录。'

Download the raw file