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

Linux Shell 脚本题目集(2)

1、使用 case 语句根据用户输入的分数(0-100)输出相应的成绩等级(A, B, C, D)。

#! /bin/bash

read -p "请输入您的分数(0-100):" score

# 验证输入是否为数字且在0到100之间
if ! [[ "$score" =~ ^[0-9]+$ ]] || [ "$score" -lt 0 ] || [ "$score" -gt 100 ]; then
    echo "请输入0-100之间的有效分数!"
    exit 1
fi

case "$score" in
  8[5-9]|9[0-9]|100)   # 85-100为A
    echo "A"
    ;;
  7[0-9]|8[0-4])       # 70-84为B
    echo "B"
    ;;
  6[0-9])              # 60-69为C
    echo "C"
    ;;
  *)
    echo "D"           # 其他(0-60)为D
    ;;
esac

测试示例:

2、使用 for 循环批量创建20个用户。用户前缀和初始密码由用户输入,用户名格式为 前缀01 到 前缀20,并为每个用户设置相同的初始密码。输出每个用户的创建结果。 

#! /bin/bash

# 获取用户输入的前缀和初始密码
read -p "请输入用户前缀:" prefix
read -s -p  "请输入用户初始密码:" password

echo "正在为您循环创建20个用户..."

# 循环创建20个用户
for i in $(seq -w 1 20)
do
  username="${prefix}${i}"
  if useradd "$username";then               # 创建用户
    echo "$username:$password" | chpasswd   # 设置用户密码
    echo "用户 $username 已创建并设置了初始密码。"
  else
    echo "创建用户 $username 失败。"
  fi 
done

测试示例:

3、批量 Ping 测试并记录在线和离线主机

要求

  1. 用户输入

    • 输入网段前缀(如 192.168.2)。
    • 输入 Ping 测试的起始和结束 IP 地址范围(如 10 到 20)。
  2. Ping 测试

    • 根据用户输入生成完整的 IP 地址列表。
    • 对每个 IP 地址进行 Ping 测试,判断主机是否在线。
  3. 记录结果

    • 在线主机的 IP 地址记录到 /tmp/host_up.txt
    • 离线主机的 IP 地址记录到 /tmp/host_down.txt
#! /bin/bash

read -p "请输入网段前缀(如:192.168.2):" prefix
echo "请输入测试的IP范围(0-255之间)"

while true
do
  read -p "起始IP地址(如:10):" start
  read -p "结束IP地址(如:20):" end

  # 检查输入是否为数字,并且在有效范围内
  if [[ "$start$end" =~ ^[0-9]+$ ]] && [ "$start" -ge 0 ] &&  [ "$start" -le 255 ] && [ "$end" -le 255 ] && [ "$end" -ge "$start" ]
  then
    break
  else
    echo "起始IP或结束IP输入有误!"
    echo "请输入有效的起始和结束IP(0-255),且起始IP不大于结束IP。"
  fi
done

# 输出文件
up_file="/tmp/host_up.txt"
down_file="/tmp/host_down.txt"

# 创建或清空输出文件
> "$up_file"
> "$down_file"

for i in $(seq "$start" "$end")   # 循环测试
do 
  ip="${prefix}.${i}"
  ping -c 2 -w 2 "$ip" &> /dev/null
  if [ $? -eq 0 ];then
    echo "$ip" >> "$up_file"
    echo "主机 $ip 在线"
  else
    echo "$ip" >> "$down_file"
    echo "主机 $ip 离线"
  fi 
done

echo  "测试完毕,结果已保存到 $up_file 和 $down_file"

测试示例:

4、批量修改远程主机 root 密码

要求:

  1. 使用 for 循环:读取 hosts.txt 文件中的主机 IP,依次连接并修改 root 密码。
  2. 记录结果:无论成功或失败,详细记录到 password_change.log,包括时间戳、IP 地址和错误信息。
  3. SSH 公钥认证
    • 生成 SSH 密钥对(如 ed25519)。
    • 使用 ssh-copy-id 分发公钥到远程主机。

 在管理主机上生成SSH密钥对

 分发公钥到远程主机

 分发给远程主机192.168.108.131

  分发给远程主机192.168.108.133

创建主机IP文件hosts.txt

 批量修改密码脚本

#!/bin/bash

# 定义日志文件路径
LOG_FILE="password_change.log"

# 清空日志文件
> $LOG_FILE

# 提示用户输入新密码
echo "请输入新的 root 密码:"
read -s -p "密码: " new_password
echo
read -s -p "确认密码: " confirm_password
echo

# 检查两次输入的密码是否一致
if [ "$new_password" != "$confirm_password" ]; then
    echo "密码不匹配。退出脚本。"
    exit 1
fi

# 检查密码是否为空
if [ -z "$new_password" ]; then
    echo "密码不能为空。退出脚本。"
    exit 1
fi

# 读取主机列表文件并使用 for 循环处理每个主机
for host in $(cat hosts.txt); do
    echo "正在处理主机: $host" | tee -a $LOG_FILE

    # 尝试通过 SSH 执行远程命令修改密码
    if ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@$host "echo 'root:$new_password' | chpasswd"; then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 密码修改成功:$host" | tee -a $LOG_FILE
    else
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 密码修改失败:$host" | tee -a $LOG_FILE
        echo "错误详情:" | tee -a $LOG_FILE
        # 记录详细的错误信息
        ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@$host "echo 'root:$new_password' | chpasswd" 2>&1 | tee -a $LOG_FILE
    fi

    echo "----------------------------------------" | tee -a $LOG_FILE
done

测试示例:

查看日志文件:


http://www.kler.cn/a/418510.html

相关文章:

  • Java之链表1
  • 斐波那契数
  • 关于音频 DSP 的接口种类以及其应用场景介绍
  • 数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)
  • Python学习第十天--处理CSV文件和JSON数据
  • 学习threejs,使用设置lightMap光照贴图创建阴影效果
  • LuaForWindows_v5.1.5-52.exe
  • JS的魔法三角:constructor、prototype与__proto__
  • WordPress 项目迁移的完整指南:步骤与注意事项
  • 【Android】从事件分发开始:原理解析如何解决滑动冲突
  • osg加载模型丢失纹理
  • 在oracle下载jdk显示400 Bad Request Request Header Or Cookie Too Large
  • pdf也算是矢量图——pdf大小调整--福昕pdf
  • 多源传感器构建机器人的Gazebo模型
  • 【遥感综合实习】专题二 多维度遥感数据分析 梁子湖流域土地利用与景观格局变化研究
  • 基于链表的基础笔试/面试题
  • Qt-界面优化QSS
  • 即时通讯| IM+RTC在AI技术加持下的社交体验
  • spaCy 入门与实战:强大的自然语言处理库
  • springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)
  • API 与 SDK 之间的区别
  • QUAD-MxFE平台
  • 【LeetCode】3208.交替组II
  • 基于PHP的香水销售系统的设计与实现
  • Qt自定义 Qt Designer 插件
  • 使用Python OpenCV实现图像形状检测