使用自定义Shell脚本快速配置Linux用户账户
在学校实验室管理Linux服务器,或者公司小团队管理服务器时,大家需要一个能隔离自己服务,但是自己又需要对服务器的完整权限的情形。创建和配置用户账户是一项常见但繁琐的任务。特别是当你需要频繁为新团队成员设置账户,或在多台服务器上保持一致的用户配置时,linux本身用户指令已经很完善,手动添加也方便,但是我偶尔碰到这种添加用户的需求,还是感觉繁琐和麻烦,所以还是想写个脚本快速创建用户,分配root,docker权限。
今天,我要分享一个名为hello
的自定义脚本,希望它能帮助你一键完成用户创建、权限设置、Docker组管理等操作,简化你系统管理的工作。
脚本功能概述
hello
脚本提供以下功能:
- 创建新用户并设置密码
- 配置sudo权限(无需密码)
- 自动添加用户到Docker组(如果存在)
- 创建友好的
.bashrc
配置和系统信息显示 - 生成包含账户信息的README文件
- 检测Docker服务状态并提供相关提示
安装和使用方法
步骤1:创建脚本文件
首先,使用你喜欢的文本编辑器创建脚本文件:
sudo vim /usr/local/bin/hello
步骤2:粘贴以下代码
将下面的代码复制到编辑器中:
#!/bin/bash# 获取脚本的基本名称,而不是完整路径
SCRIPT_NAME=$(basename "$0")if [ $# -ne 1 ]; thenecho "用法: $SCRIPT_NAME 用户名" # 使用基本名称而不是完整路径echo "例如: $SCRIPT_NAME ck" # 使用基本名称而不是完整路径exit 1
fiUSERNAME=$1# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; thenecho "错误: 请使用root权限运行此脚本"exit 2
fi# 检查docker服务是否安装和运行
if ! command -v docker &> /dev/null; thenecho "警告: Docker未安装"docker_installed=false
elif ! systemctl is-active --quiet docker 2>/dev/null; thenecho "警告: Docker服务未运行"docker_installed=truedocker_running=false
elseecho "确认: Docker服务正在运行"docker_installed=truedocker_running=true
fi# 检查用户是否已存在
if id "$USERNAME" &>/dev/null; thenecho "用户 $USERNAME 已存在,将更新配置..."user_existed=true
elseecho "创建新用户 $USERNAME..."useradd -m -s /bin/bash $USERNAME# 设置密码为单个空格echo -e " \n " | passwd $USERNAME 2>/dev/null || \{ echo " " | passwd --stdin $USERNAME 2>/dev/null; } || \{ echo "$USERNAME: " | chpasswd 2>/dev/null; } || \{ echo "警告: 无法设置空格密码,使用用户名作为临时密码"; echo "$USERNAME:$USERNAME" | chpasswd; }user_existed=false
fiUSER_HOME=$(eval echo ~$USERNAME)# 创建.bashrc或添加自定义配置(保留有用的shell配置)
if [ "$user_existed" = false ] || [ ! -f "$USER_HOME/.bashrc" ]; then# 如果是新用户或没有.bashrc,创建一个新的cp /etc/skel/.bashrc "$USER_HOME/.bashrc"
fi# 添加一些有用的别名和环境变量到.bashrc
if ! grep -q "# User custom aliases and functions" "$USER_HOME/.bashrc"; thencat >> "$USER_HOME/.bashrc" << 'EOF'# User custom aliases and functions
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'# 显示系统信息
if [ "$TERM" != "dumb" ]; thenecho "欢迎, $(whoami)@$(hostname)"dateecho ""echo "系统负载: $(cat /proc/loadavg)"echo "内存使用: $(free -h | grep Mem | awk '{print $3 " / " $2}')"echo "磁盘使用: $(df -h / | grep / | awk '{print $3 " / " $2 " (" $5 ")"}')"echo ""
fi
EOF
fi# 创建简单的README文件
cat > "$USER_HOME/README.txt" << EOF
欢迎使用服务器账户:$USERNAME账户特权:
- 具有sudo权限(无需密码)
$(if getent group docker > /dev/null && groups "$USERNAME" | grep -q "\bdocker\b"; thenecho "- 可直接使用docker命令(已加入docker组)"
fi)使用提示:
- 请根据个人习惯创建和组织目录结构
- 请定期清理不必要的文件以节省磁盘空间如有任何问题请联系系统管理员。
EOF# 确保所有文件属于用户
chown -R $USERNAME:$USERNAME "$USER_HOME"# 检查docker组是否存在并处理
if getent group docker > /dev/null; then# 检查用户是否已在docker组中if groups "$USERNAME" | grep -q "\bdocker\b"; thenecho "用户 $USERNAME 已在docker组中"elseecho "将 $USERNAME 添加到docker组..."usermod -aG docker $USERNAMEfi
elseecho "警告: docker组不存在,无法将用户添加到docker组"if [ "$docker_installed" = true ]; thenecho "Docker已安装但docker组不存在,这可能是配置问题"fi
fi# 确保用户有sudo权限(无需密码)
if [ -f "/etc/sudoers.d/$USERNAME" ]; thenecho "用户 $USERNAME 的sudo配置已存在,确保权限正确..."
elseecho "设置 $USERNAME 的sudo权限..."
fi
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME
chmod 0440 /etc/sudoers.d/$USERNAME# 输出操作总结
echo "----------------------------------------"
echo "操作完成!"
if [ "$user_existed" = true ]; thenecho "- 已更新用户 $USERNAME 的配置"
elseecho "- 已创建用户 $USERNAME (密码为空格)"
fi
echo "- 已设置自定义.bashrc配置"
echo "- 已确保sudo权限(无需密码)"# docker相关状态
if getent group docker > /dev/null; thenif groups "$USERNAME" | grep -q "\bdocker\b"; thenecho "- 已确保用户在docker组中"fi
elseecho "- 未添加到docker组(组不存在)"
fi# 输出docker状态总结
echo "----------------------------------------"
echo "Docker状态:"
if [ "$docker_installed" = false ]; thenecho "- Docker未安装,如需使用,请先安装Docker:"echo " sudo apt update && sudo apt install docker.io -y"echo " 或参考Docker官方安装指南"
elif [ "$docker_running" = false ]; thenecho "- Docker已安装但未运行,可使用以下命令启动:"echo " sudo systemctl start docker"echo " sudo systemctl enable docker # 设置开机自启"
elseecho "- Docker服务正常运行中"
fi# 如果用户已创建但docker组不存在,提供重新运行的提示
if [ "$user_existed" = true ] && ! getent group docker > /dev/null && [ "$docker_installed" = true ]; thenecho "----------------------------------------"echo "提示: 安装Docker后,请重新运行此脚本将用户 $USERNAME 添加到docker组"
fiecho "----------------------------------------"
echo "用户 $USERNAME 的主目录: $USER_HOME"
echo "可通过以下命令登录用户: su - $USERNAME"
步骤3:设置执行权限
保存文件后,为脚本添加执行权限:
sudo chmod 775 /usr/local/bin/hello # 让同组用户也可直接执行,编辑
### 使用方法现在,你可以通过简单的命令创建或更新用户:```bash
sudo hello username
例如,创建名为"baijs"的用户:
sudo hello baijs
脚本代码部分注释
1. 用户创建和密码设置
脚本首先检查用户是否已存在,如果不存在,则创建用户并设置密码。为了便于新用户第一次登录,脚本尝试设置一个简单的密码(空格字符):
# 设置密码为单个空格
echo -e " \n " | passwd $USERNAME 2>/dev/null || \
{ echo " " | passwd --stdin $USERNAME 2>/dev/null; } || \
{ echo "$USERNAME: " | chpasswd 2>/dev/null; } || \
{ echo "警告: 无法设置空格密码,使用用户名作为临时密码"; echo "$USERNAME:$USERNAME" | chpasswd; }
这段代码尝试多种方法设置空格密码,确保在不同的Linux发行版上都能正常工作。如果所有方法都失败,将回退到使用用户名作为密码。
2. 自定义Shell环境
脚本为新用户配置了一个友好的Shell环境:
- 实用的别名(
ll
,la
,..
, 等) - 登录时显示系统状态信息
- 定制的
.bashrc
配置
当用户登录时,他们会看到类似这样的信息:
欢迎, username@hostname
Wed Mar 26 15:30:45 CST 2025系统负载: 0.15 0.05 0.01 1/292 3021
内存使用: 1.2G / 8.0G
磁盘使用: 12G / 50G (25%)
3. 权限和组管理
脚本自动处理以下权限相关配置:
- 配置sudo权限(无需密码)
- 检测并添加用户到Docker组(如果存在)
- 确保所有主目录文件的所有权正确
4. 便捷的用户文档
脚本在用户主目录创建README.txt文件,包含使用指南和账户特权信息,这里可以修改成你实验室的一些须知信息或者其他:
欢迎使用服务器账户:username账户特权:
- 具有sudo权限(无需密码)
- 可直接使用docker命令(已加入docker组)使用提示:
- 请根据个人习惯创建和组织目录结构
- 请定期清理不必要的文件以节省磁盘空间如有任何问题请联系系统管理员。
自定义脚本
你可以根据自己的需求修改脚本。以下是一些常见的自定义点:
调整安全设置
如果你需要更严格的安全策略,可以修改sudo权限部分:
# 限制sudo权限到特定命令
echo "$USERNAME ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/apt" > /etc/sudoers.d/$USERNAME
常见问题排查
如果脚本执行遇到问题,请检查以下几点:
脚本找不到或无法执行
遇到"command not found"或"Permission denied"错误时:
# 检查脚本权限
ls -la /usr/local/bin/hello# 修复权限
sudo chmod +x /usr/local/bin/hello# 确保脚本在PATH中
sudo ln -sf /usr/local/bin/hello /usr/bin/hello