跳过正文
集群用户管理:批量创建、删除、配额与跨节点同步

集群用户管理:批量创建、删除、配额与跨节点同步

Ridiculous
作者
Ridiculous
Love is the greatest magic in the world.

这篇记录整理集群用户管理相关操作,包括批量创建用户、保留 home 目录删除用户、磁盘配额和跨节点同步用户信息。

用户列表约定
#

批量脚本统一使用当前目录下的 userlist 作为用户列表,每行一个用户名。

示例:

user01
user02
user03

批量创建用户
#

脚本行为:

  • 如果用户已存在则跳过。
  • 创建用户并加入 wheel 组。
  • 默认 shell 为 /bin/bash
  • 初始密码设置为用户名。
  • home 目录权限设置为 700
#!/bin/bash

if [ ! -f userlist ]; then
  echo "用户列表文件 userlist 不存在!"
  exit 1
fi

while IFS= read -r username; do
  if id "$username" &>/dev/null; then
    echo "用户 $username 已存在,跳过创建"
  else
    useradd -m -g wheel -s /bin/bash "$username" && echo "$username:$username" | chpasswd

    if [ $? -eq 0 ]; then
      echo "用户 $username 创建成功,密码已设置为用户名"
      chmod 700 /home/"$username"
      if [ $? -eq 0 ]; then
        echo "用户 $username 的 /home 目录权限已设置为 700"
      else
        echo "用户 $username 的 /home 目录权限设置失败"
      fi
    else
      echo "用户 $username 创建失败"
    fi
  fi
done < userlist

创建完成后,可以把登录节点的 /etc/passwd/etc/shadow/etc/group 同步到计算节点,使用户可以登录计算节点。

批量删除用户但保留目录
#

删除用户前准备 userdel 文件,每行一个用户名。该脚本只删除用户账户,不删除用户 home 目录。

#!/bin/bash

USERDEL_FILE="userdel"

if [[ ! -f "$USERDEL_FILE" ]]; then
  echo "Error: 文件 $USERDEL_FILE 不存在"
  exit 1
fi

while IFS= read -r user; do
  if id "$user" &>/dev/null; then
    user_home=$(eval echo "~$user")
    sudo userdel "$user"

    if [[ $? -eq 0 ]]; then
      echo "用户 $user 已成功删除,保留目录 $user_home"
    else
      echo "删除用户 $user 时出现问题"
    fi
  else
    echo "用户 $user 不存在于本节点,跳过"
  fi
done < "$USERDEL_FILE"

echo "所有操作已完成"

磁盘配额
#

如果 /home 挂载在某个特定节点,例如 gpu02,配额应在挂载点所在节点操作。并且设置配额时该节点需要存在对应用户;配额设置完成后可以删除该节点上的账户。

示例:为 userlist 中所有用户设置 2 GB 配额。

#!/bin/bash

if [[ ! -f userlist ]]; then
  echo "userlist 文件不存在。"
  exit 1
fi

while IFS= read -r user; do
  if id "$user" &>/dev/null; then
    setquota -u "$user" 2048000 2048000 0 0 -a
    echo "为用户 $user 设置了磁盘配额为 2GB。"
  else
    echo "用户 $user 不存在,无法设置配额。"
  fi
done < userlist

跨节点同步用户
#

最直接的方法是同步以下文件:

  • /etc/passwd
  • /etc/shadow
  • /etc/group

示例:

sudo cp /etc/passwd /home/wukuangzheng
sudo cp /etc/shadow /home/wukuangzheng
sudo cp /etc/group /home/wukuangzheng

scp /home/wukuangzheng/passwd asc@gpu07:/home/asc
scp /home/wukuangzheng/shadow asc@gpu07:/home/asc
scp /home/wukuangzheng/group asc@gpu07:/home/asc

ssh asc@gpu07

sudo mv ./passwd /etc
sudo mv ./shadow /etc
sudo mv ./group /etc

如果有 root 权限,也可以直接复制:

scp /etc/passwd asc@gpu07:/etc
scp /etc/shadow asc@gpu07:/etc
scp /etc/group asc@gpu07:/etc

这种方式会直接覆盖目标节点文件,操作前建议先备份:

sudo cp /etc/passwd /etc/passwd.bak
sudo cp /etc/shadow /etc/shadow.bak
sudo cp /etc/group /etc/group.bak

更稳妥的做法是只追加新增用户和组,避免覆盖目标节点已有系统账户或服务账户。