一、主程序
#!/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
函数来创建用户。
总的来说,这个脚本的目的是自动化用户创建过程,通过一个通用密码为一系列新用户设置账户和密码。此脚本还可以进一步增强,例如添加密码复杂性检查、支持逐个指定密码或引入更优的错误处理机制等。
三、程序实战提升①
- 密码现在需要手动输入,而不是使用硬编码的通用密码。
- 添加了检查手动输入密码的逻辑。如果未输入密码,则会提示用户输入密码,如果用户仍未输入,则自动生成一个8位包含大小写字母和数字的随机密码。
- 使用了
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
安装,因此需要先确保它已安装以便生成密码。
在运行此脚本之前,请确认你有足够的权限执行上述安装命令。毕竟,根据所处的系统环境和配置,可能需要调整此脚本以确保它能够正确执行。