当前位置: 首页 > news >正文

# 使用自定义Shell脚本hello快速配置Linux用户账户

使用自定义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 ]; then
    echo "用法: $SCRIPT_NAME 用户名"  # 使用基本名称而不是完整路径
    echo "例如: $SCRIPT_NAME ck"     # 使用基本名称而不是完整路径
    exit 1
fi

USERNAME=$1

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
    echo "错误: 请使用root权限运行此脚本"
    exit 2
fi

# 检查docker服务是否安装和运行
if ! command -v docker &> /dev/null; then
    echo "警告: Docker未安装"
    docker_installed=false
elif ! systemctl is-active --quiet docker 2>/dev/null; then
    echo "警告: Docker服务未运行"
    docker_installed=true
    docker_running=false
else
    echo "确认: Docker服务正在运行"
    docker_installed=true
    docker_running=true
fi

# 检查用户是否已存在
if id "$USERNAME" &>/dev/null; then
    echo "用户 $USERNAME 已存在,将更新配置..."
    user_existed=true
else
    echo "创建新用户 $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
fi

USER_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"; then
    cat >> "$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" ]; then
    echo "欢迎, $(whoami)@$(hostname)"
    date
    echo ""
    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"; then
    echo "- 可直接使用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"; then
        echo "用户 $USERNAME 已在docker组中"
    else
        echo "将 $USERNAME 添加到docker组..."
        usermod -aG docker $USERNAME
    fi
else
    echo "警告: docker组不存在,无法将用户添加到docker组"
    if [ "$docker_installed" = true ]; then
        echo "Docker已安装但docker组不存在,这可能是配置问题"
    fi
fi

# 确保用户有sudo权限(无需密码)
if [ -f "/etc/sudoers.d/$USERNAME" ]; then
    echo "用户 $USERNAME 的sudo配置已存在,确保权限正确..."
else
    echo "设置 $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 ]; then
    echo "- 已更新用户 $USERNAME 的配置"
else
    echo "- 已创建用户 $USERNAME (密码为空格)"
fi
echo "- 已设置自定义.bashrc配置"
echo "- 已确保sudo权限(无需密码)"

# docker相关状态
if getent group docker > /dev/null; then
    if groups "$USERNAME" | grep -q "\bdocker\b"; then
        echo "- 已确保用户在docker组中"
    fi
else
    echo "- 未添加到docker组(组不存在)"
fi

# 输出docker状态总结
echo "----------------------------------------"
echo "Docker状态:"
if [ "$docker_installed" = false ]; then
    echo "- Docker未安装,如需使用,请先安装Docker:"
    echo "  sudo apt update && sudo apt install docker.io -y"
    echo "  或参考Docker官方安装指南"
elif [ "$docker_running" = false ]; then
    echo "- Docker已安装但未运行,可使用以下命令启动:"
    echo "  sudo systemctl start docker"
    echo "  sudo systemctl enable docker  # 设置开机自启"
else
    echo "- Docker服务正常运行中"
fi

# 如果用户已创建但docker组不存在,提供重新运行的提示
if [ "$user_existed" = true ] && ! getent group docker > /dev/null && [ "$docker_installed" = true ]; then
    echo "----------------------------------------"
    echo "提示: 安装Docker后,请重新运行此脚本将用户 $USERNAME 添加到docker组"
fi

echo "----------------------------------------"
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

相关文章:

  • 【408--复习笔记】数据结构
  • 第十三届蓝桥杯单片机省赛程序设计试题
  • linux/android 如何获取当前系统启动时长
  • Vue学习笔记集--导航篇
  • 精华贴分享|从不同的交易理论来理解头肩形态,殊途同归
  • WPF的MVVM的基础知识
  • 推荐一个可以自定义github主页的网站
  • 深度剖析 Spring 源码 性能优化:核心原理与最佳实践
  • uniapp 在app上 字体如何不跟着系统字体大小变
  • deepseek(2)——deepseek 关键技术
  • OpenEuler linux samba部分目录无法访问的问题
  • 使用 Spring Boot 3.2 集成 MinIO 8.5:实现高效对象存储
  • 爬虫豆瓣电影
  • 大模型开发框架LangChain GO
  • 基于Kubernetes部署Prometheus监控平台
  • 探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率
  • spring batch 中JpaNamedQueryProvider、JpaNativeQueryProvider两种查询方式对比
  • Graphpad Prism for Mac医学绘图
  • Svelte 深度理解
  • 31天Python入门——第15天:日志记录
  • 15世纪以来中国文化如何向欧洲传播?《东学西传文献集成初编》发布
  • 海尔·2025青岛马拉松两选手被终身禁赛:违规转让号码、穿戴他人号码
  • 四川苍溪县教育局通报“工作人员辱骂举报学生”:停职检查
  • 专访|伊朗学者:美伊核谈不只是改革派立场,但伊朗不信任美国
  • 他比李白接地气,比杜甫乐观,比白居易刚毅
  • 蚂蚁集团将向全体股东分红