一、编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如:test1、test2、test3、......、test10
实现思路
- 通过
read
命令获取用户输入的账户前缀和初始密码; - 加入非空校验:若前缀或密码为空,退出脚本并提示;
- 使用
for循环
遍历 1-20 的数字,拼接前缀生成账户名(如前缀+1
); - 用
id -u 账户名
判断账户是否存在,不存在则创建并设置密码。
代码实现
[root@node1 ~]# vim for1.sh
#!/bin/bash# 功能:批量创建带前缀的20个账户,支持密码设置与重复校验# 获取用户输入:账户前缀和初始密码
read -p "请输入账户名前缀:" name
read -p "请输入账户的密码:" passwd# 非空校验:若前缀或密码为空,提示并退出
if [ -z $name ] || [ -z $passwd ]
thenecho "请输入有效前缀名和密码!"exit
else# for循环遍历1-20,生成账户名并创建for ((i=1;i<=20;i++))douser=$name$i # 拼接账户名(如前缀为rch时,i=1则为rch1)# 判断账户是否已存在(id -u 账户名 &> /dev/null 无输出则存在)if id -u $user &> /dev/nullthenecho "账户已存在"continue # 跳过当前循环,进入下一次elseuseradd $user# 为新账户设置密码(--stdin表示从标准输入获取密码)echo "$passwd" | passwd --stdin root &> /dev/nullecho "$user创建成功"fidone
fi
测试验证
# 测试1:输入为空(前缀或密码为空)
[root@node1 ~]# bash for1.sh
请输入账户名前缀:
请输入账户的密码:
请输入有效前缀名和密码!
[root@node1 ~]# bash for1.sh
请输入账户名前缀:rch
请输入账户的密码:
请输入有效前缀名和密码!
[root@node1 ~]# bash for1.sh
请输入账户名前缀:
请输入账户的密码:123
请输入有效前缀名和密码!# 测试2:正常输入前缀和密码
[root@node1 ~]# bash for1.sh
请输入账户名前缀:rch
请输入账户的密码:123
rch1创建成功
rch2创建成功
rch3创建成功
rch4创建成功
rch5创建成功
rch6创建成功
rch7创建成功
rch8创建成功
rch9创建成功
rch10创建成功
rch11创建成功
rch12创建成功
rch13创建成功
rch14创建成功
rch15创建成功
rch16创建成功
rch17创建成功
rch18创建成功
rch19创建成功
rch20创建成功
二、编写脚本for2.sh,使用for循环,通过ping命令测试网段的主机连通性,IP前3段由用户输入,如:输入192.168.48 ,则ping 192.168.48.125-192.168.48.135,将可以ping通的主机IP地址写入到 /tmp/host_up.txt文件中,不能ping通的主机IP地址写入到:/tmp/host_down.txt文件中
实现思路
- 通过
read
命令获取 IP 前 3 段(如192.168.48
),加入非空校验; - 使用
for循环
遍历目标主机的最后一段 IP(如 120-130),拼接完整 IP; - 用
ping
命令检测连通性(发 2 个包,超时 3 秒),根据结果写入对应文件; - 为结果添加颜色标记(绿色表示通,红色表示不通)
代码实现
[root@node1 ~]# vim for2.sh
#!/bin/bash# 功能:批量检测网段内主机连通性,区分保存通/不通的IP# 获取IP前3段(如192.168.120)
read -p "请输入网络主机号:" ip# 非空校验:若输入为空,提示并退出
if [ -z $ip ]
thenecho "请输入有效主机号"exit
else# for循环遍历最后一段IP(120-130),可根据需求修改范围for ((i=120;i<=130;i++))doIP=$ip.$i # 拼接完整IP(如192.168.120.120)# ping检测:-c 2发2个包,-w 3超时3秒,结果重定向到/dev/nullif ping -c 2 -w 3 $IP &> /dev/nullthen# 连通:绿色标记并写入host_up.txtecho -e "\e[32m $IP\e[0m" >> /tmp/host_up.txtelse# 不通:红色标记并写入host_down.txtecho -e "\e[1;31m $IP\e[0m" >> /tmp/host_down.txtfidone
fi
测试验证
[root@node1 ~]# bash for2.sh
请输入网络主机号:
请输入有效主机号
[root@node1 ~]# bash for2.sh
请输入网络主机号:192.168.120# 查看结果文件(另开终端)
[root@node1 ~]# tail -f /tmp/host_down.txt 192.168.120.120192.168.120.121192.168.120.122192.168.120.123192.168.120.124192.168.120.125192.168.120.126192.168.120.127192.168.120.129
[root@node1 ~]# tail -f /tmp/host_up.txt 192.168.120.128192.168.120.130
颜色提示如下:
三、使用for循环实现批量主机root密码的修改
实现思路
- 准备 IP 列表文件(
ip.txt
),存放需修改密码的主机 IP; - 通过
ssh-keygen
生成密钥对,用ssh-copy-id
实现免密登录(避免输入密码); - 用
for循环
读取 IP 列表,通过ssh
远程执行密码修改命令。
前置准备(免密登录配置)
# 1. 生成ssh密钥对(一路回车默认配置)
[root@master ~]# ssh-keygen -t rsa# 2. 将公钥复制到目标主机(实现免密登录)
[root@master ~]# ssh-copy-id root@192.168.120.130 # 替换为目标IP
# 首次执行需输入目标主机root密码# 3. 验证免密登录(无需输密码即登录成功)
[root@master ~]# ssh root@192.168.120.130
[root@node1 ~]# # 成功登录# 4. 准备IP列表文件
[root@master ~]# vim ip.txt # 写入需管理的主机IP
192.168.120.130
# 可添加多个IP,每行一个
代码实现
[root@master ~]# vim for3.sh
#!/bin/bash# 功能:批量修改多台主机的root密码(需提前配置免密登录)read -p "请输入密码:" passwd# for循环遍历ip.txt中的所有主机IP
for i in $(cat ip.txt)
do# 通过ssh远程登录主机,执行密码修改命令# echo $passwd | passwd --stdin root:将密码通过标准输入传给passwdssh $i "echo $passwd | passwd --stdin root"
done
测试验证
[root@master ~]# bash for3.sh
请输入密码:1234567890Authorized users only. All activities may be monitored and reported.
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。# 验证:登录目标主机,用新密码成功登录
[root@master ~]# ssh root@192.168.120.130
root@192.168.120.130's password: # 输入新密码1234567890
[root@node1 ~]# # 登录成功,密码修改生效
总结
批量创建账户脚本(for1.sh)通过读取用户输入的前缀和密码,结合循环遍历与账户存在性检测,快速生成规范命名的账户,非空校验确保了输入的有效性,避免了因参数缺失导致的创建失败。
网段连通性检测脚本(for2.sh)则利用 ping 命令的特性,对用户指定网段内的连续 IP 进行批量检测,将结果按连通状态分类保存并添加颜色标记,让网络状态一目了然,简化了网段排查工作。
多主机密码修改脚本(for3.sh)的关键在于前置的免密登录配置,通过 ssh 密钥对实现无交互登录后,循环遍历 IP 列表执行密码修改命令,轻松解决了多台服务器密码统一管理的难题。