实战自动化创建用户,并设置密码

一、主程序

#!/bin/bash# 创建用户并设置密码的函数
create_user() {local username=$1local password=$2if id "$username" &>/dev/null; thenecho "用户 $username 已经存在。"elseecho "正在创建用户 $username ..."useradd $usernameecho "$username:$password" | chpasswdecho "已为用户 $username 设置密码。"fi
}# 读取输入信息
echo "请输入要创建的用户列表,用逗号隔开:"
read user_input# 检查用户输入是否为空
if [ -z "$user_input" ]; thenecho "输入错误,未提供任何用户名。"exit 1
fi# 设置通用密码
PASSWORD="xxxxxxxxxxxxxxx"# 分割输入的用户,并为每个用户调用创建函数
IFS=',' read -ra USERS <<< "$user_input"
for username in "${USERS[@]}"; docreate_user "$username" "$PASSWORD"
done

二、程序分析

这个脚本提供了一个用户创建操作的自动化过程。下面是脚本主要部分的分析:

  • create_user 函数:

    • 这个函数用来创建一个新用户。它接受两个参数:$1 (用户名) 和 $2 (密码)。
    • local username=$1 和 local password=$2 定义了两个局部变量,这避免了在函数内部对全局变量进行操作。
    • id "$username" &>/dev/null 这个命令检查系统中是否已存在用户名为$username的用户。&>/dev/null 将命令的标准输出和错误输出都重定向到 /dev/null(即丢弃这些输出)。
    • 如果用户已存在(if 条件为真),则打印存在信息。
    • 如果用户不存在,使用 useradd 命令创建用户,然后通过管道将新密码传递给 chpasswd 命令来设置密码。
  • 脚本的剩余部分:

    • 提示用户输入一系列用户名,用逗号分隔。
    • 检查用户输入是否为空,若为空则打印错误信息并退出脚本。
    • 设置了一个变量 PASSWORD 存储通用密码 "xxxxxxxxxx"
    • 使用 IFS=',' read -ra USERS <<< "$user_input" 将输入的用户列表字符串分隔成数组。IFS (内部字段分隔符) 被临时设置成逗号 ,read -ra 读入输入到名为 USERS 的数组。
    • 最后一个 for 循环遍历数组 USERS 中的每个用户名,并对每个用户名调用 create_user 函数来创建用户。

总的来说,这个脚本的目的是自动化用户创建过程,通过一个通用密码为一系列新用户设置账户和密码。此脚本还可以进一步增强,例如添加密码复杂性检查、支持逐个指定密码或引入更优的错误处理机制等。

三、程序实战提升①

  1. 密码现在需要手动输入,而不是使用硬编码的通用密码。
  2. 添加了检查手动输入密码的逻辑。如果未输入密码,则会提示用户输入密码,如果用户仍未输入,则自动生成一个8位包含大小写字母和数字的随机密码。
  3. 使用了 pwgen 命令来生成随机密码。确保您的系统中已安装 pwgen

下面是优化后的脚本:

bash

#!/bin/bash# 引入 pwgen 命令,用于生成随机密码
if ! command -v pwgen &> /dev/null; thenecho "pwgen 命令未找到,请先安装 pwgen。"exit 1
fi# 创建用户并设置密码的函数
create_user() {local username=$1local password=$2if id "$username" &>/dev/null; thenecho "用户 $username 已经存在。"elseecho "正在创建用户 $username ..."useradd $usernameecho "$username:$password" | chpasswdecho "已为用户 $username 设置密码。"fi
}# 读取输入信息
echo "请输入要创建的用户列表,用逗号隔开:"
read user_input# 检查用户输入是否为空
if [ -z "$user_input" ]; thenecho "输入错误,未提供任何用户名。"exit 1
fi# 请求用户输入密码
echo "请输入用户密码(留空将自动生成8位的随机密码):"
read -s user_password# 如果用户未输入密码,则生成8位随机密码
if [ -z "$user_password" ]; thenuser_password=$(pwgen 8 1)echo "未提供密码,将为所有用户使用随机密码:$user_password"
fi# 分割输入的用户,并为每个用户调用创建函数
IFS=',' read -ra USERS <<< "$user_input"
for username in "${USERS[@]}"; docreate_user "$username" "$user_password"
done

这个脚本包括了以下改进:

  • 使用 pwgen 生成随机密码,该工具需要预先安装。
  • read -s 允许安静地(无回显)读取密码,提升安全性。

 四、程序实战提升②

包括手动输入密码、密码的验证、生成随机密码以及根据不同系统类型自动安装pwgen工具的功能。

bash

#!/bin/bash# 创建用户并设置密码的函数
create_user() {local username=$1local password=$2if id "$username" &>/dev/null; thenecho "用户 $username 已经存在。"elseecho "正在创建用户 $username ..."useradd $usernameecho "$username:$password" | chpasswdecho "已为用户 $username 设置密码。"fi
}# 确保 pwgen 工具已安装
ensure_pwgen_installed() {if ! command -v pwgen &>/dev/null; thenecho "pwgen 命令未找到,请先安装 pwgen。"# 判断系统类型并安装 pwgenlocal os_type=$(uname -s)case "$os_type" inLinux)if [ -f /etc/debian_version ]; then# 基于Debian的系统sudo apt-get update && sudo apt-get install -y pwgenelif [ -f /etc/redhat-release ]; then# 基于RedHat的系统sudo yum install -y pwgenelseecho "未识别的 Linux 发行版。请手动安装 pwgen。"fi;;Darwin)# macOS 系统brew install pwgen;;*)echo "不支持的操作系统。请手动安装 pwgen。";;esacfi
}# 生成随机密码的函数
generate_random_password() {ensure_pwgen_installedpwgen 8 1
}# 读取输入信息
echo "请输入要创建的用户列表,用逗号隔开:"
read user_input# 检查用户输入是否为空
if [ -z "$user_input" ]; thenecho "输入错误,未提供任何用户名。"exit 1
fi# 获取密码
echo "请输入要设置的密码(留空则为每个用户生成随机密码):"
read -s user_password# 如果未输入密码则生成随机密码
if [ -z "$user_password" ]; thenecho "未输入密码,将为每个用户生成随机密码。"user_password=$(generate_random_password)
fi# 分割输入的用户,并为每个用户调用创建函数
IFS=',' read -ra USERS <<< "$user_input"
for username in "${USERS[@]}"; docreate_user "$username" "$user_password"
done

请注意,为了自动安装pwgen,该脚本需要运行管理权限,即可能需要用户在提示时输入密码。我为基于Debian和RedHat的Linux系统以及macOS系统添加了自动安装命令。如果用户的系统与这些不匹配或者不支持,那么会输出提示让用户手动安装pwgen。在一些系统中,默认不包括pwgen安装,因此需要先确保它已安装以便生成密码。

在运行此脚本之前,请确认你有足够的权限执行上述安装命令。毕竟,根据所处的系统环境和配置,可能需要调整此脚本以确保它能够正确执行。

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

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

相关文章

【PostgreSQL内核学习(二十九)—— 执行器(ExecCreateTableAs)】

执行器&#xff08;ExecCreateTableAs&#xff09; ExecCreateTableAs 函数RangeVarGetCreationNamespace 函数RangeVar 结构体IntoClause 结构体 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求…

python篇---图片转成视频

python篇—图片转成视频 import cv2 import os# 设置图片文件夹路径和视频输出路径 image_folder /workspace/11 video_name output_video.mp4# 获取图片文件夹中的所有图片文件名&#xff0c;并按顺序排序 images [img for img in os.listdir(image_folder) if img.endswi…

C++的引用和内联函数,auto

什么是引用 引用就是取别名 可以给一个变量取多个别名,也可以给别名取别名 别名与本名拥有同一地址,对任意别名修改,也会同时修改其他别名和本名 引用的作用 引用的作用与指针重叠度很高 图中函数的参数int& a,int& b,a是x的别名,b是y的别名 则ab的交换就是xy的交…

ActiveMQ消息中间件面试专题

1.什么是 ActiveMQ? activeMQ 是一种开源的&#xff0c;实现了 JMS1.1 规范的&#xff0c;面向消息(MOM)的中间件&#xff0c;为应用程序提供高效的、 可扩展的、稳定的和安全的企业级消息通信 2. ActiveMQ 服务器宕机怎么办&#xff1f; 这得从 ActiveMQ 的储存机制说起。…

怎么快速围绕“人、货、场”做零售数据分析?

做零售数据分析多了&#xff0c;不难发现零售数据分析的关键就是“人、货、场”&#xff0c;那么怎么又快又灵活地分析这三个关键点&#xff1f;不妨参考下奥威BI零售数据分析方案。 奥威BI零售数据分析方案是一套吸取大量项目经验&#xff0c;结合零售企业数据分析共性需求打…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么&#xff1f;三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

同旺科技 USB TO SPI / I2C 专业版 极限测试 ---- 读取数据

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 备注&#xff1a;带EXCEL调试的只适用于专业版&#xff1b; 软件配置&#xff1a; 设置如下&#xff0c;读取65500个字节&#xff0c;单条指令&#xff0c;速率20Mhz; 数据&#xff1a; 时钟信号&#…

Day10:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 五、尚上优选微信小程序端 订单支付 需求分析 页面效果功能分析对应接口 开发接口 创建service-payment模块 创建子模块service-payment创建配置文件创建启动类引入依赖…

微信扫码授权登录成功后,重定向用户回到他们最初尝试访问的URL

你的需求是在微信扫码授权登录成功后&#xff0c;重定向用户回到他们最初尝试访问的URL&#xff0c;而不是重定向到一个固定的页面。为了实现这一点&#xff0c;你需要在用户登录前&#xff0c;将他们尝试访问的页面URL保存起来&#xff0c;然后在登录成功后&#xff0c;使用这…

了解 Python 中 gc.collect() 命令

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;gc.collect() 命令是用于手动触发垃圾回收机制&#xff0c;以回收无法访问的对象所占用的内存。Python 的垃圾回收机制主要基于引用计数&#xff0c;辅以 “标记-清除” 和 “…

echarts坐标轴、轴线、刻度、刻度标签

坐标轴 x、y轴 x 轴和 y 轴都由轴线、刻度、刻度标签、轴标题四个部分组成。部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有x轴和y轴&#xff0c;通常情况下&#xff0c;x轴显示在图表底部&#xff0c;y轴显示在左侧&#xff0c;一般配置如下&#xf…

【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

目录 树和森林树的存储结构一、树的双亲表示法&#xff1a;二、树的孩子表示法方法一&#xff1a;定长结点的多重链表方法二&#xff1a;不定长结点的多重链表方法三&#xff1a;孩子单链表表示法 三、树的二叉链表(孩子-兄弟)存储表示法 森林与二叉树的转换树和森林的遍历先根…

QT使用单例模式创建全局引用类

单例模式介绍 单例模式是一种设计模式,用于确保类只能创建一个实例,并提供一种全局访问该实例的方式。在单例模式中,类的构造函数被私有化,这样就不能通过常规方式创建对象实例。相反,类提供一个静态方法或静态变量来获取其唯一的实例。 单例模式通常用于管理全局状态或…

设计一个健壮的漏洞检测模块需要考虑多个方面

设计一个健壮的漏洞检测模块需要考虑多个方面&#xff0c;包括漏洞数据库、扫描策略、结果解析和报告生成等。以下是一个简化的设计概述和一些模拟数据及测试示例。 漏洞检测模块设计 漏洞数据库&#xff1a; 包含一个已知的漏洞列表&#xff0c;每个漏洞都有唯一的标识符、描…

MPP-媒体软件V5.0开发参考

0. 写在前面 本篇博文用于记录工作项目中遇到的ss928板端视频获取相关内容。、 1. API参考 系统控制实现MPP(Media Process Platform)系统初始化、系统绑定解绑、获取MPP版本号、视频缓存池初始化、创建视频缓存池等功能。 ●ss_mpi_sys_set_cfg:配置系统控制参数。 ●ss_mp…

uni-app实现分页--(1)准备工作,首页下拉触底加载更多

实现流程如下: 分析&#xff1a;需要在滚动容器中添加滚动触底&#xff0c;在猜你喜欢中获取数据。难点&#xff1a;如何在父页面调用子组件内的方法。父组件中用ref&#xff0c;并定义组件实例类型&#xff0c;子组件中暴露方法 具体代码如下&#xff1a; 1.在父组件中添加…

sqlplus / as sysdba下中文乱码问题

export NLS_LANGamerican_america.AL32UTF8 export LANGen_US.UTF-8 set NLS_LANGamerican_america.AL32UTF8 set LANGen_US.UTF-8 select userenv(language) from dual;可以查出数据库的字符集 select * from nls_database_parameters where parameter LIKE %CHARACTERSET%…

计算机专业考研考哪些专业课

https://zhuanlan.zhihu.com/p/182416996 计算机专业考研的专业课通常包括以下几个主要科目&#xff0c;但具体的考试科目和内容可能会根据不同的学校和专业方向有所差异&#xff1a; 数据结构&#xff1a; 这是计算机科学的基础课程之一&#xff0c;涉及算法和数据结构的设计、…

计算机视觉——基于深度学习UNet实现的复杂背景文档二值化算法实现与模型训练

1. 引言 阈值分割可以被视为一个分类问题&#xff0c;通常涉及两个类别&#xff0c;这也是为什么阈值分割也被称为二值化。对于文档图像&#xff0c;我们期望阈值算法能够正确地将墨水分类为黑色&#xff0c;将纸张分类为白色&#xff0c;从而得到二值化图像。对于数字灰度图像…

OpenCV | 基于视频的基础操作

目录 一. OpenCV 关于视频的基础操作1. cv.VideoCapture ( ) 读取摄像头 / 视频文件2. cv.VideoCapture ( ).set ( ) 设置视频属性3. cv.VideoCapture ( ).get ( ) 打印视频属性4. cv.VideoCapture ( ).read ( ) 读帧5. capture.release ( ) 释放资源6. cv.VideoWriter ( ) 视频…