# 使用自定义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 ]; 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity Animation的其中一种运用方式

Animation是Unity的旧的动画系统&#xff0c;先说目的&#xff0c;其使用是为了在UI中播放动效&#xff0c;并且在动效播放结束后接自定义事件而设计的 设计的关键点在于&#xff0c;这个脚本不是通过Animation直接播放动画片段&#xff0c;而是通过修改AnimationState的nor…

matplotlib——南丁格尔玫瑰

南丁格尔玫瑰图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;是一种特殊形式的柱状图&#xff0c;它以南丁格尔&#xff08;Florence Nightingale&#xff09;命名&#xff0c;她在1858年首次使用这种图表来展示战争期间士兵死亡原因的数据。 它将数据绘制在极坐…

TensorFlow面试题及参考答案

目录 什么是 TensorFlow 的计算图?详细描述 TensorFlow 计算图的组成结构(节点、边、会话) 它与动态图(Eager Execution)的区别是什么?TensorFlow 静态计算图与动态图(Eager Execution)的区别及适用场景是什么? 解释张量(Tensor)的概念及其在 TensorFlow 中的作用…

6.go语言函数

Go语言中的函数是组织代码的最小单元&#xff0c;用于封装一段代码&#xff0c;完成特定的功能。函数的使用可以减少代码冗余&#xff0c;提高代码的可读性和可维护性。 函数的基本定义和语法 在Go语言中&#xff0c;定义一个函数的基本语法如下&#xff1a; func functionN…

SpringCould微服务架构之Docker(4)

Docker ce是社区版。 安装docker之前&#xff0c;先安装yum-util 。 安装docker之前&#xff0c;一定要先关闭防火墙。

Keepalived 实现高可用方案

Keepalived简介 ‌Keepalived‌ 是一个基于 ‌VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;协议‌的高可用性解决方案&#xff0c;主要用于实现‌服务故障自动切换&#xff08;Failover&#xff09;和负载均衡‌。通过管理虚拟 IP&#xff08;VIP&#xf…

WPS JS宏编程教程(从基础到进阶)--第二部分:WPS对象模型与核心操作

第二部分&#xff1a;WPS对象模型与核心操作 WPS对象的属性、方法、集合 工作簿对象常用表达方式工作表对象常用表达方式单元格对象常用表达方式 单元格操作实战 单元格复制与重定位单元格偏移与尺寸调整 颜色设置专题 索引颜色与RGB颜色按条件动态设置单元格颜色 第二部分&…

基于DrissionPage的TB商品信息采集与可视化分析

一、项目背景 随着电子商务的快速发展,淘宝作为中国最大的电商平台之一,拥有海量的商品信息。这些数据对于市场分析、用户行为研究以及竞争情报收集具有重要意义。然而,由于淘宝的反爬虫机制和复杂的页面结构,直接获取商品信息并不容易。尤其是在电商行业高速发展的今天,商…

【003安卓开发方案调研】之ReactNative技术开发安卓

基于2025年最新行业动态和搜索资料&#xff0c;以下是针对国内使用React Native&#xff08;RN&#xff09;开发安卓应用的深度分析&#xff1a; 一、技术成熟度评估 1. 核心架构升级 新架构全面普及&#xff1a;2024年起&#xff0c;React Native的 新架构&#xff08;Fabri…

JS数组方法

数组方法 一、数组 JavaScript 数组的大小是可调整的&#xff0c;并且可以包含不同 数据类型。&#xff08;当不需要这些特性时&#xff0c;请使用 类型数组。&#xff09; 注&#xff1a;JavaScript 类型数组是类似数组的对象&#xff0c;它提供了一种在内存缓冲区中读取和写…

【一起学Rust | Tauri2.0框架】深入浅出 Tauri 2.0 应用调试:从新手到专家的蜕变

前言 Tauri 是一款备受瞩目的跨平台桌面应用开发框架&#xff0c;它允许开发者使用 Web 技术栈&#xff08;HTML、CSS、JavaScript&#xff09;构建高性能、安全的原生应用。Tauri 2.0 的发布带来了诸多令人兴奋的新特性和改进&#xff0c;进一步提升了开发体验和应用性能。然…

Python项目-基于Python的网络爬虫与数据可视化系统

1. 项目简介 在当今数据驱动的时代&#xff0c;网络爬虫和数据可视化已成为获取、分析和展示信息的重要工具。本文将详细介绍如何使用Python构建一个完整的网络爬虫与数据可视化系统&#xff0c;该系统能够自动从互联网收集数据&#xff0c;进行处理分析&#xff0c;并通过直观…

TCP/IP三次握手的过程,为什么要3次?

一&#xff1a;过程 第一次&#xff08;SYN&#xff09;&#xff1a; 客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;设置SYN1&#xff0c;并携带初始序列号Seqx&#xff08;随机值&#xff09;&#xff0c;进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…

消息队列性能比拼: Kafka vs RabbitMQ

本内容是对知名性能评测博主 Anton Putra Kafka vs RabbitMQ Performance 内容的翻译与整理, 有适当删减, 相关数据和结论以原作结论为准。 简介 在本视频中&#xff0c;我们将首先比较 Apache Kafka 和传统的 RabbitMQ。然后&#xff0c;在第二轮测试中&#xff0c;会将 Kaf…

打磨和修改:字帖自动生成

功能增加一些。 一个人和大语言模型对话的结果。 不过是重复性劳动&#xff0c;特别需要创意的地方还是不容易做到。

电脑干货:万能驱动--EasyDrv8

目录 万能驱动EasyDrv8 功能介绍 主程序界面 驱动解压与安装 PE环境支持 系统部署环境 桌面环境一键解决方案 万能驱动8电脑版是由IT天空出品的一款智能识别电脑硬件并自动安装驱动的工具&#xff0c;一般又称为it天空万能驱动&#xff0c;万能驱动vip版&#xff0c;简称…

LeetCode热题100JS(79/100)第十五天|347|295|121|55|45

347. 前 K 个高频元素 题目链接&#xff1a;347. 前 K 个高频元素 难度&#xff1a;中等 刷题状态&#xff1a;1刷 新知识&#xff1a; 解题过程 思考 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 没思路&#xff0c;看答案 题解分析 参考题解链接&#xff1a…

Sentinel 限流利器(功能以及源码解析)

Sentinel简介 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 核心概念 资源 资源是…

子数组 之 logTrick算法,求解或,与,LCM,GCD

文章目录 gcd的问题最大公约数 求解子数组的&,|,lcm,gcd的最值or计数问题&#xff0c;如果采用暴力的做法&#xff0c;那么时间复杂度会来到o(n^2),其实在求解的过程中&#xff0c;会出现很多的结果不变的情况&#xff0c;所以我们就可以提前结束 存在一定的单调性&#x…

How to use pgbench to test performance for PostgreSQL?

pgbench 是一个用于测试 PostgreSQL 数据库性能的基准测试工具。通过模拟多个客户端并发执行 SQL 查询&#xff0c;它可以帮助你评估数据库的性能。以下是使用 pgbench 的基本步骤&#xff1a; 安装 pgbench pgbench 是 PostgreSQL 的一部分&#xff0c;因此在安装 PostgreSQ…