如何用脚本同步时间

wen 实用脚本 1

本文目录导读:

如何用脚本同步时间

  1. Linux 系统(使用 ntpdatechrony
  2. Windows 系统(PowerShell 或 CMD)
  3. macOS 系统(使用 sntp
  4. 跨平台通用脚本(利用 Python)
  5. 物联网/嵌入式设备(Shell 脚本)
  6. 使用建议与注意事项

Linux 系统(使用 ntpdatechrony

方法 A:使用 ntpdate(传统、简单)

如果你的系统安装了 ntpdate,可以直接使用:

#!/bin/bash
# 同步系统时间
# 使用多个 NTP 服务器,如果第一个失败,尝试下一个
sudo ntpdate -u cn.pool.ntp.org || sudo ntpdate -u ntp.ubuntu.com || sudo ntpdate -u pool.ntp.org

说明

  • -u 参数绕过防火墙限制(使用非特权端口)。
  • 如果成功,系统时间会立即更新。
  • 建议配合 cron 任务(如每天凌晨执行)使用。

方法 B:使用 chrony(现代、推荐)

在大多数新 Linux 发行版(如 Ubuntu 18.04+, CentOS 8+)中,推荐使用 chrony

#!/bin/bash
# 强制立即同步(-I 选项)
sudo chronyc makestep
# 或者等待自动同步(通常只需几秒)
# sudo chronyc waitsync 30

说明

  • 前提是系统已安装并启用了 chronyd 服务。
  • makestep 会立即进行时间跳变(适合刚开机或时间偏差大时)。
  • 使用 cronsystemd timer 定期执行。

一键脚本(适用于 DEB/RPM 兼容系统)

#!/bin/bash
# 自动选择可用的同步工具
if command -v chronyc &> /dev/null; then
    sudo chronyc makestep
elif command -v ntpdate &> /dev/null; then
    sudo ntpdate -u pool.ntp.org
elif command -v timedatectl &> /dev/null; then
    # 尝试使用 systemd-timesyncd
    sudo timedatectl set-ntp true
    sudo timedatectl status
else
    echo "未找到合适的时间同步工具,请安装 chrony 或 ntpdate"
    exit 1
fi

Windows 系统(PowerShell 或 CMD)

方法 A:使用 PowerShell(推荐)

# 同步系统时间(需要管理员权限)
# 强制立即同步并更新
w32tm /resync /force

高级版本(修改时间服务器并同步)

# 以管理员身份运行
# 设置 NTP 服务器为阿里云或国家授时中心
w32tm /config /manualpeerlist:"ntp.aliyun.com,0x8 time.nist.gov,0x8" /syncfromflags:manual /update
# 强制重新同步
w32tm /resync /rediscover

方法 B:使用批处理(CMD)

@echo off
echo 正在同步系统时间...
w32tm /resync /force
if %errorlevel% equ 0 (
    echo 时间同步成功!
) else (
    echo 同步失败,请检查网络或权限。
)
pause

说明

  • 必须以管理员身份运行,否则会报错(错误码 5)。
  • 该命令在 Windows 10/11 和 Windows Server 2016+ 上有效。

macOS 系统(使用 sntp

#!/bin/bash
# macOS 同步时间
# 需要管理员权限
sudo sntp -sS time.apple.com
# 或者使用系统自带的时间服务
# sudo systemsetup -setusingnetworktime on
# sudo systemsetup -setnetworktimeserver time.apple.com

说明

  • -s 表示只设置一次(不进入守护进程模式)。
  • -S 立即生效。
  • 如果系统启用了“日期与时间 > 自动设置”(System Preferences),通常无需手动同步。

跨平台通用脚本(利用 Python)

#!/usr/bin/env python3
# 用途:简单的 HTTP 时间同步(不依赖系统 NTP 服务)
# 原理:通过 HTTP 响应头获取时间
import requests
import socket
import struct
import time
def sync_via_http():
    # 方式1:使用 HTTP 请求头(最可靠)
    try:
        r = requests.get('https://www.baidu.com', timeout=5)
        # 解析标准化的 Date 头
        server_time = r.headers['date']
        # 转换为本地时间并直接设置(需要权限)
        # 注意:Python 无法直接设置系统时间,需要调用系统命令
        print(f"服务器时间: {server_time}")
        # 这里可以调用系统命令:ntpdate、date 等
        return True
    except:
        return False
# 或者实现 SNTP 协议(更精确)
def sync_via_sntp(server="ntp.aliyun.com"):
    # SNTP 协议实现(简化版)
    NTP_DELTA = 2208988800  # 1900-1970 年的秒数差
    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        client.settimeout(2)
        # 构造 NTP 请求包(RFC 4330)
        data = b'\x1b' + 47 * b'\0'
        client.sendto(data, (server, 123))
        response, _ = client.recvfrom(1024)
        t = struct.unpack("!12I", response)[10] - NTP_DELTA
        print(f"NTP 服务器时间(Unix时间戳): {t}")
        # 在此处调用系统命令设置时间
        return True
    except:
        return False
if __name__ == "__main__":
    sync_via_sntp()

物联网/嵌入式设备(Shell 脚本)

#!/bin/sh
# 适用于 BusyBox / OpenWrt 等精简系统
# 需要具有 root 权限
# 方式1:使用 busybox 自带的 ntpdate
busybox ntpdate -n -p 4 0.cn.pool.ntp.org
# 方式2:直接通过 TCP 获取 HTTP 时间(精简版)
# 使用日期命令的解析功能(需依赖 wget 或 curl)
echo "Retrieving time from HTTP..."
SERVER_TIME=$(curl -sI --max-time 5 https://www.qq.com | grep -i '^date:' | cut -d' ' -f2-)
if [ -n "$SERVER_TIME" ]; then
    date -s "$SERVER_TIME"
    echo "时间已同步: $SERVER_TIME"
fi

使用建议与注意事项

  1. 权限问题:修改系统时间通常需要 root/管理员 权限,脚本中应使用 sudo 或以管理员身份运行。

  2. 服务器选择

    • 中国地区常用:ntp.aliyun.comntp.tencent.comcn.pool.ntp.org
    • 国际通用:pool.ntp.orgtime.google.comtime.apple.com
  3. 定时执行

    • Linux:添加 crontab 任务(sudo crontab -e),例如每天凌晨 3 点执行:0 3 * * * /path/to/your_script.sh
    • Windows:使用任务计划程序。
  4. 防火墙:如果使用 NTP(UDP 123端口)被防火墙阻塞,建议使用 -u 参数(Linux ntpdate)或改为 HTTP/HTTPS 时间同步。

  5. 虚拟环境:虚拟机同步时间有时会出现偏差,建议在宿主机上开启时间同步功能,然后在虚拟机内禁用 NTP 服务以避免冲突。

如果只是经常手动同步,推荐使用 Linux 的 chrony 或 Windows 的 w32tm 通过任务计划程序,这样可以自动保持系统时间准确。

抱歉,评论功能暂时关闭!