这篇记录整理集群用户管理相关操作,包括批量创建用户、保留 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
更稳妥的做法是只追加新增用户和组,避免覆盖目标节点已有系统账户或服务账户。


