全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1372|回复: 26

为了同步时间,我绞尽脑汁写了个bash脚本,很粗糙,

[复制链接]
发表于 2024-3-6 08:07:51 | 显示全部楼层 |阅读模式
盒子一断电就丢失时间,每次都要设置。。。
查了不少资料,才写下这么段脚本。

我土木工程专业的,非专业勿喷。

  1. #!/usr/bin/bash
  2. #
  3. exec 5<>/dev/udp/ntp.tencent.com/123
  4. echo -e -n "\\x1b\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0"  >&5

  5. resp=$(timeout 2 dd bs=48 count=1 <&5 2>/dev/null | sed -n "s/.\{40\}\(.\{4\}\)/\1/p")

  6. printf -v r1 "%02x" "'${resp:0:1}"
  7. printf -v r2 "%02x" "'${resp:1:1}"
  8. printf -v r3 "%02x" "'${resp:2:1}"
  9. printf -v r4 "%02x" "'${resp:3:1}"
  10. r=${r1}${r2}${r3}${r4}

  11. d=`expr $((0x${r})) - 2208988800`

  12. date -s "@$d"
复制代码
发表于 2024-3-6 08:57:22 来自手机 | 显示全部楼层
https://www.baota.me/post-214.html
发表于 2024-3-6 08:12:58 来自手机 | 显示全部楼层
干嘛不用 GPT
发表于 2024-3-6 08:14:28 | 显示全部楼层
ntpdate不直接就可以了么? 为什么要这么大段?
 楼主| 发表于 2024-3-6 08:15:59 | 显示全部楼层
icon 发表于 2024-3-6 08:14
ntpdate不直接就可以了么? 为什么要这么大段?

盒子空间有限,ntpdate 安装容量太大
 楼主| 发表于 2024-3-6 08:17:26 | 显示全部楼层
icon 发表于 2024-3-6 08:14
ntpdate不直接就可以了么? 为什么要这么大段?

本来打算纯shell语言写,发现没办法实现。

需要额外的dd sed和expr命令。
发表于 2024-3-6 08:19:39 来自手机 | 显示全部楼层
盒子同步确实麻烦,而且各家地址不同
发表于 2024-3-6 08:27:05 | 显示全部楼层
没玩过盒子,不明白为什么要同步,另外以下是chatgpt 优化过的代码,你自己看对不对,不知道你要用于做什么:

  1. #!/usr/bin/bash

  2. # NTP服务器地址和端口
  3. NTP_SERVER="ntp.tencent.com"
  4. NTP_PORT=123

  5. # 创建UDP连接
  6. exec 5<>/dev/udp/${NTP_SERVER}/${NTP_PORT}

  7. # 发送NTP请求包 (NTP协议指定的格式)
  8. printf '\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >&5

  9. # 读取并处理NTP响应
  10. if read -u 5 -t 2 -r -n 48 response; then
  11.   # 提取时间戳并转换为十进制
  12.   time_stamp=$(printf '%d\n' "'${response:43:1}'")
  13.   for ((i=1; i<4; i++)); do
  14.     printf -v temp '%d' "'${response:43+i:1}'"
  15.     time_stamp=$((time_stamp*256 + temp))
  16.   done

  17.   # 转换NTP时间戳到Unix时间戳
  18.   unix_time=$((time_stamp - 2208988800))

  19.   # 设置系统时间
  20.   if date -s "@$unix_time" > /dev/null; then
  21.     echo "时间已成功同步至: $(date)"
  22.   else
  23.     echo "设置系统时间失败。"
  24.   fi
  25. else
  26.   echo "从NTP服务器获取时间失败。"
  27. fi
复制代码
发表于 2024-3-6 08:35:16 | 显示全部楼层
对啊,用gpt很快的
 楼主| 发表于 2024-3-6 08:36:20 | 显示全部楼层
Sam_Edward 发表于 2024-3-6 08:27
没玩过盒子,不明白为什么要同步,另外以下是chatgpt 优化过的代码,你自己看对不对,不知道你要用于做什么 ...

能否使用nc命令创建udp连接?
发表于 2024-3-6 08:42:28 | 显示全部楼层
我以前用的这个
  1. date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-28 15:08 , Processed in 0.066891 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表