在运维工作中,如何使用shell脚本,取出20个主机中,与当前主机时间不匹配的节点并且计算出时间的间隔?

news/2025/3/12 14:28:59/文章来源:https://www.cnblogs.com/huangjiabobk/p/18767483

在运维工作中,使用Shell脚本检查多个主机的时间,并找出与当前主机时间不匹配的节点,同时计算时间间隔,是一个非常实用的任务。以下是一个详细的步骤和脚本示例,帮助你完成这个任务。

1. 目标
  1. 获取当前主机的时间。
  2. 通过SSH连接到其他主机,获取它们的时间。
  3. 比较每个主机的时间与当前主机的时间,计算时间差。
  4. 输出时间不匹配的主机及其时间差。
2. 前提条件
  1. SSH免密登录:确保当前主机可以通过SSH免密登录到目标主机。
  2. 主机列表:准备一个包含目标主机IP或主机名的列表。
  3. 权限:确保当前用户在目标主机上有执行date命令的权限。
3. 脚本实现

以下是一个完整的Shell脚本示例,用于实现上述功能:

3.1 脚本代码
#!/bin/bash# 当前主机的时间(以秒为单位的Unix时间戳)
current_time=$(date +%s)# 主机列表文件(每行一个主机名或IP地址)
host_list="hosts.txt"# 时间差异阈值(单位:秒,例如5分钟=300秒)
threshold=300# 检查主机时间并计算时间差
while IFS= read -r host; do# 使用ssh获取远程主机的时间(Unix时间戳)remote_time=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "$host" "date +%s" 2>/dev/null)# 检查是否成功获取时间if [ -z "$remote_time" ]; thenecho "无法连接到主机 $host 或获取时间失败。"continuefi# 计算时间差(绝对值)time_diff=$((current_time - remote_time))time_diff=${time_diff#-}  # 取绝对值# 检查时间差是否超过阈值if [ "$time_diff" -gt "$threshold" ]; then# 将时间差转换为更易读的格式(分钟和秒)minutes=$((time_diff / 60))seconds=$((time_diff % 60))echo "主机 $host 的时间与当前主机时间不匹配,时间差为 $minutes 分钟 $seconds 秒。"fi
done < "$host_list"
3. 2. 脚本说明**
  1. 获取当前主机的时间

    current_time=$(date +%s)
    

    使用date +%s获取当前时间的Unix时间戳(以秒为单位)。

  2. 主机列表文件
    将目标主机的IP地址或主机名存储在一个文本文件中(例如hosts.txt),每行一个:

    host1.example.com
    host2.example.com
    ...
    host20.example.com
    
  3. 通过SSH获取远程主机的时间

    remote_time=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "$host" "date +%s" 2>/dev/null)
    
    • 使用ssh命令连接到远程主机并执行date +%s,获取其时间戳。
    • -o ConnectTimeout=5:设置SSH连接超时时间为5秒。
    • -o BatchMode=yes:禁用SSH交互式密码输入。
    • 2>/dev/null:将错误输出重定向到/dev/null,避免因连接失败而输出错误信息。
  4. 计算时间差
    使用简单的算术运算计算当前主机与远程主机的时间差,并取绝对值:

    time_diff=$((current_time - remote_time))
    time_diff=${time_diff#-}  # 取绝对值
    
  5. 判断时间是否匹配
    如果时间差超过设定的阈值(例如300秒),则输出相关信息:

    if [ "$time_diff" -gt "$threshold" ]; thenminutes=$((time_diff / 60))seconds=$((time_diff % 60))echo "主机 $host 的时间与当前主机时间不匹配,时间差为 $minutes 分钟 $seconds 秒。"
    fi
    
3.3 运行脚本
  1. 将脚本保存为check_time.sh

  2. 确保脚本具有可执行权限:

    chmod +x check_time.sh
    
  3. 运行脚本:

    ./check_time.sh
    
3.4. 输出示例**

如果某个主机的时间与当前主机时间不匹配,脚本将输出类似以下内容:

主机 host3.example.com 的时间与当前主机时间不匹配,时间差为 4 分钟 20 秒。
主机 host15.example.com 的时间与当前主机时间不匹配,时间差为 2 分钟 30 秒。
4. 扩展功能
  1. 自动同步时间
    如果发现时间不匹配的主机,可以使用ntpdatechronyc命令自动同步时间:

    ssh "$host" "ntpdate time.example.com"
    

    或者:

    ssh "$host" "chronyc -a makestep"
    
  2. 日志记录
    将结果记录到日志文件中,便于后续分析:

    echo "主机 $host 的时间与当前主机时间不匹配,时间差为 $minutes 分钟 $seconds 秒。" >> time_check.log
    
  3. 并行执行
    如果主机数量较多,可以使用xargsparallel工具并行执行SSH命令,提高效率:

    cat hosts.txt | parallel -j 10 ./check_time.sh {}
    
5. 我的总结

综上所述,通过这个脚本,你可以快速检查多个主机的时间,并找出与当前主机时间不匹配的节点,同时计算时间差。这对于运维工作中确保时间同步非常有帮助。

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

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

相关文章

那智机器人维修30编码器异常报警代码处理

那智机器人维修报警代码的核心功能,在于为技术人员提供机器人在运作流程中遭遇故障或异常时的详尽信息,以便他们能够迅速且准确地锁定问题所在,并采取有效的修复措施。这些报警代码被精心设计为多个类别,每一个类别都精准对应着一种特定的故障或异常情形,使得问题的诊断与…

html的基本理论

一、html介绍 1、html是一个超文本标记语言,也是一种标识性语言。(不是编程语句) 2、标记:记号(绰号) 3、超文本:就是页面内容包含图片、链接、音乐、视频等素材 4、为什么学习html? a、测试页面功能,需要了解页面元素(页面是html语言编写的) b、方便我们进行ui自动…

MySql 主从(备)部署 | 冷备份

前言 MySQL 主从复制(Master-Slave Replication)是一种常见的数据库架构设计,用于提高数据可用性、实现读写分离以及支持备份策略。冷备份是指在数据库关闭状态下进行的数据备份方式。这种方式简单直接,但需要导致服务中断。在数据库管理中,确保数据的高可用性和灾难恢复能…

全局变量 global 、globalThis、nodejs内置全局API

在nodejs 环境中 index.js 引用 a.js ,在index.js 设置全局变量 global.xxx = xxx ,被引用的a.js 也读取全局变量xxx 但是在浏览器环境下,全局变量在 window。不同的环境需要判断,所以CMAScript 2020 出现了一个globalThis全局变量,在nodejs环境会自动切换成global 。…

如果看到子数组是数组中元素的连续非空序列,你能想到什么?

首先先讲一下前缀和,例如[1,1,1]的前缀和为[1,2,3]。所以在题目当中子数组是数组中元素的连续非空序列,立马联想到前缀和去解题。如力扣第560题和为K的子数组。 但是为了得到一个公式,如下(灵神思路)所以本题目,可以把K看成所要求的子数组和,而连续子数组的元素和可以根…

在 Hugging Face 上部署语音转语音模型

介绍 S2S (语音到语音) 是 Hugging Face 社区内存在的一个令人兴奋的新项目,它结合了多种先进的模型,创造出几乎天衣无缝的体验: 你输入语音,系统会用合成的声音进行回复。 该项目利用 Hugging Face 社区中的 Transformers 库提供的模型实现了流水话处理。该流程处理由以下组…

session,cookie和token究竟是什么

session,cookie和token究竟是什么 简述 cookie,session,token作为面试必问题,很多同学能答个大概,但是又迷糊不清,希望本篇文章对大家有所帮助 http是一个无状态协议 什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。这种无状态…

算法心得(2)**前缀和**

**思路** 前缀和的思想就是 **把影响累加起来,每一次累加都作一次记录** 一般在情况满足两个条件时就使用它: (1)影响可以累加 (2)有多个查询 就拿计算二维矩阵面积来说:图中红框框起的一个子矩阵的面积为9+8+4-2+3+11=33,同时以左上角(蓝框,坐标为(2,2))和右下…

爬取Microsoft Bing网站图片

说明: 这个小案例主要是访问Microsoft Bing网站去爬取“车牌”图片,代码写的时候不规范,但是效果还行文件结构为下图:具体思路#爬取html.py import requests import time from tqdm import tqdm import os url=https://cn.bing.com/images/async headers={User-Agent:Mozill…

打开组策略,提示找不到资源$(string.WHFB_DisablePostLogonCredentialCaching)(在属性 displayName 中引|用)

情况 win11家庭版不提供组策略,因此我使用了网络上提供的命令进行开启。 开启后使用win自带的搜索,搜索组策略或是gpedit都没有反应,使用命令行输入gpedit可以正常跳出窗口,然而打开组策略提示如下。未解决 https://bbs.pcbeta.com/viewthread-1688611-1-1.html https://an…

Processing (Java) 中实现2D任意图形的鼠标悬停检测 2D射线检测 模拟按钮 点击事件

引言 如果使用Processing开发应用,画面中需要设定一些按钮,而且这些按钮是不规则图形样式,甚至是以一张图片形式呈现,如何判定其轮廓,定义悬停事件、点击事件是非常核心的算法需求。本文浅析这一问题的通用解决方案。因为Processing是Java衍生语言,同样适合java语言体系。…

运行窗口无法打开软件程序的解决办法

事情起因:  本人安装了 Notepad-- 文本编辑软件,但是通过Win+R,打开运行窗口,输入Notepad-- 无法打开该软件;报错如下: 解决办法  此电脑-属性-高级系统设置-高级-环境变量  在 系统变量 里,找到 Path 变量 添加软件安装路径,并上移 确定保存,电脑重启,系统环…