【问题标题】:SSH into multiple servers and compare timestamps of each serverSSH进入多台服务器并比较每台服务器的时间戳
【发布时间】:2022-10-17 06:03:46
【问题描述】:

我需要添加所有远程服务器的时间戳作为输出的一部分,并检查和比较时间戳是否相同,

我可以打印机器 IP 和日期。

#!/bin/bash

all_ip=(192.168.1.121 192.168.1.122 192.168.1.123)

for ip_addr in "${all_ip[@]}"; do
  aws_ip=$"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
  date=date
  sshpass -p "password" ssh root@$ip_addr "$aws_ip & $date"
  echo "==================================================="
done

获取输出为:

Wed 27 Jul 2022 05:48:15 AM PDT
192.168.1.121
===================================================
Wed Jul 27 05:48:15 PDT 2022
192.168.1.122
===================================================
Wed Jul 27 05:48:15 PDT 2022
192.168.1.123
===================================================

如何检查时间戳(忽略秒) 所有机器是否相同,

例如:(2022 年 7 月 27 日星期三 05:48:15 || 2022 年 7 月 27 日星期三 05:48:15 || 2022 年 7 月 27 日星期三 05:48:15)

预期输出:

|| Time are in sync on all machines || # if in sync

|| Time are not in sync on all machines || # if not sync

Wed 27 Jul 2022 05:48:15 AM PDT
192.168.1.121
===================================================
Wed Jul 27 05:48:15 PDT 2022
192.168.1.122
===================================================
Wed Jul 27 05:48:15 PDT 2022
192.168.1.123
===================================================

【问题讨论】:

  • 我建议为日期输出选择更容易比较的不同格式,例如date +%s(自 1970-01-01 00:00:00 UTC 以来的秒数)。您还应该考虑到date 命令可能不会在完全相同的时间运行,这可能会产生微小的差异。当您有超过 2 台机器时,“所有机器上的日期/时间不同”的说法与“所有机器上的日期/时间不同”的说法并不完全相同。
  • 您使用的是 ntp 还是 chrony 或其他什么?您的所有机器是否都同步到相同的时间服务器?
  • @jhnc 使用 crontab 进行日期时间同步 date --set="" 通过 ansible 设置时间
  • @rowoc 不,我不能。我不知道谁否决了这个问题。忽略秒是不够的。甚至年份也可以在一毫秒内改变。该命令可能在 2022 年 12 月 31 日 23:59:59(和 999 毫秒)在一台机器上和 2023 年 1 月 1 日 00:00:00(和 1 毫秒)在另一台机器上执行。这就是为什么我建议比较date +%s 的输出。您可以检查最大值和最小值之间的差异是否高于一个小限制。
  • 这里的目标是证明你的机器都有相同的时间,如果它们不是你可以调整它们吗?如果是这样,请考虑设置一个 cron 作业以与 NTP 服务器同步,然后您就不必考虑它了。

标签: bash


【解决方案1】:

如何检查时间(忽略秒)

tmpdir=$(mktemp -d)
trap 'rm -r "$tmpdir"' EXIT
for ip in "${allips[@]}"; do
  # Do N connections, in paralllel, each one writes to a separate file.
  sshpass -p "password" ssh root@"$ip" "date +%Y-%m-%d_%H:%M" > "$tmpdir/$ip.txt" &
done
wait

times=$(
  for i in "$tmpdir"/*.txt; do
     # print filename with file contents.
     echo "$i $(<$i)"
  done |
  # Sort them on second column
  sort -k2 | 
  # Uniq on second field
  uniq -f 2
)
echo "$times"
timeslines=$(wc -l <<<"$times")
if ((timeslines == 1)); then
   echo "YAY! minutes on all servers the same"
fi

【讨论】:

    【解决方案2】:

    首先,您可以如下调整“日期”命令以排除秒数:

    date +%Y-%m-%d_%H:%M  
    

    然后,只需 grep 输出并验证所有时间戳是否相同。您可以转储到临时文件或任何其他方式。 前任:

    grep [aPatternSpecificToTheLinewithTheDate] [yourTemporaryFile] | sort | uniq | wc -l
    

    如果结果为 1,则表示所有时间戳都相同。 但是,当您从所有服务器中获取时间时,您将不得不处理分钟变化的极端情况。

    【讨论】:

    • 那不是和date '+%F_%R'一样吗?
    • 是的,不错的捷径,谢谢。
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2023-04-08
    • 2014-04-20
    • 1970-01-01
    • 2018-07-24
    • 2014-10-15
    相关资源
    最近更新 更多