#!/bin/bash set -e URL="http://www.baidu.com/" COUNT=10 echo "正在通过百度 HTTP 校准系统时间..." echo best_rtt=999999999 best_time=0 for i in $(seq 1 "$COUNT"); do start=$(date +%s%3N) headers=$(curl \ --noproxy '*' \ --connect-timeout 3 \ --max-time 5 \ -sS \ -D - \ -o /dev/null \ "$URL" 2>/dev/null) || { echo "[$i/$COUNT] 请求失败" continue } end=$(date +%s%3N) date_header=$(printf '%s\n' "$headers" | grep -i '^Date:' | tail -n 1 | sed 's/^[Dd]ate:[[:space:]]*//') if [ -z "$date_header" ]; then echo "[$i/$COUNT] 未找到 Date 头" continue fi server_sec=$(date -u -d "$date_header" +%s 2>/dev/null) || { echo "[$i/$COUNT] 无法解析 Date: $date_header" continue } rtt=$((end - start)) half_rtt=$((rtt / 2)) # Date 头的时间 + 请求往返时间的一半 estimated_ms=$((server_sec * 1000 + half_rtt)) echo "[$i/$COUNT] RTT=${rtt}ms Date=$date_header" if [ "$rtt" -lt "$best_rtt" ]; then best_rtt=$rtt best_time=$estimated_ms fi done if [ "$best_time" -eq 0 ]; then echo echo "错误:无法从百度获取时间" exit 1 fi echo echo "最佳 RTT: ${best_rtt}ms" before=$(date '+%Y-%m-%d %H:%M:%S.%3N') # 设置系统时间 date -u -s "@$(awk "BEGIN {printf \"%.3f\", $best_time / 1000}")" >/dev/null after=$(date '+%Y-%m-%d %H:%M:%S.%3N') echo "校时前: $before" echo "校时后: $after" echo "校时完成。"