全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
楼主: yaoruisheng

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

[复制链接]
发表于 2024-3-6 08:42:38 | 显示全部楼层
yaoruisheng 发表于 2024-3-6 08:36
能否使用nc命令创建udp连接?

要使用nc(Netcat)通过UDP发送NTP请求并接收响应的完整示例,首先需要注意,由于NTP响应是二进制格式的,处理这种响应需要一定的二进制到十进制的转换。以下是一个示例脚本,这个脚本发送NTP请求到一个NTP服务器,并尝试解析返回的时间戳。

请注意,这个脚本仅作为示例提供,可能需要根据实际的NTP服务器响应进行调整。该脚本的目的是展示如何使用nc发送UDP包,并非专门用于处理NTP协议。

  1. #!/bin/bash

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

  5. # 构造NTP请求数据包
  6. NTP_PACKET="\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"

  7. # 发送NTP请求并接收响应
  8. RESPONSE=$(echo -ne "$NTP_PACKET" | nc -u -w 2 $NTP_SERVER $NTP_PORT | od -An -N4 -tu4 -j40)

  9. # 转换响应为Unix时间戳
  10. if [ ! -z "$RESPONSE" ]; then
  11.   # 从NTP时间(从1900年开始的秒数)转换为Unix时间戳(从1970年开始的秒数)
  12.   UNIX_TIME=$(($RESPONSE-2208988800))
  13.   # 设置系统时间(需要root权限)
  14.   # sudo date -s "@$UNIX_TIME"
  15.   echo "NTP time: $RESPONSE, Unix time: $UNIX_TIME"
  16. else
  17.   echo "Failed to receive a response from the NTP server."
  18. fi
复制代码


此脚本的关键点包括:

    构造NTP请求: NTP请求是一个特定格式的数据包,这里简化了构造方法,只包含最基本的字段。
    发送请求并接收响应: 通过nc命令以UDP模式发送请求到NTP服务器,并设置超时为2秒。响应数据通过管道传给od命令,以便解析。
    解析响应: 使用od命令处理二进制响应,提取出NTP时间戳。这里使用的是简化处理,实际响应可能包含更多信息。
    转换时间戳: 将NTP时间戳转换为Unix时间戳。NTP时间戳的起点是1900年,Unix时间戳的起点是1970年。

注意:

    为了实际设置系统时间,你需要以root用户执行脚本,或者使用sudo来运行date命令,这里为了安全考虑,设置时间的命令被注释掉了。
    确保你的环境中已经安装了nc和od工具。
    根据你的具体环境和NTP服务器的响应,可能需要调整解析响应部分的逻辑。
 楼主| 发表于 2024-3-6 08:50:36 | 显示全部楼层
Sam_Edward 发表于 2024-3-6 08:42
要使用nc(Netcat)通过UDP发送NTP请求并接收响应的完整示例,首先需要注意,由于NTP响应是二进制格式的 ...

谢谢啊!
发表于 2024-3-6 08:54:47 | 显示全部楼层
发表于 2024-3-6 08:57:22 来自手机 | 显示全部楼层
https://www.baota.me/post-214.html
 楼主| 发表于 2024-3-6 08:57:36 | 显示全部楼层
acm 发表于 2024-3-6 08:52
NTP很大???

需要安装一堆依赖。
 楼主| 发表于 2024-3-6 08:58:40 | 显示全部楼层

这个也是可以的,不过google国内无法访问就是了。
发表于 2024-3-6 09:08:07 | 显示全部楼层
Sam_Edward 发表于 2024-3-6 08:42
要使用nc(Netcat)通过UDP发送NTP请求并接收响应的完整示例,首先需要注意,由于NTP响应是二进制格式的 ...

这个是哪个gpt工具?
发表于 2024-3-6 09:09:38 | 显示全部楼层
yaren 发表于 2024-3-6 09:08
这个是哪个gpt工具?

官方的
发表于 2024-3-6 09:56:09 | 显示全部楼层
现在AI用处还是很大的,对于代码直接就可以进行解读

date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
这段代码的作用是通过wget命令从google.com获取当前日期和时间,并将其设置为系统的日期和时间。让我详细解释一下:

wget -qSO- --max-redirect=0 google.com: 这部分使用wget命令来请求google.com网站的内容,-q参数表示以安静模式(不输出多余信息)执行,-S参数表示显示服务器的响应头信息,-O-参数表示输出到标准输出。

2>&1: 将标准错误输出重定向到标准输出,因此任何错误信息都会被包含在wget的输出中。

grep Date:: 通过grep命令来筛选包含"Date:"的行,这里是为了找到HTTP响应头中的日期信息。

cut -d' ' -f5-8: 使用cut命令来提取HTTP响应头中日期信息的具体部分,-d' '表示使用空格作为分隔符,-f5-8表示提取第5个字段到第8个字段,即日期的具体文本。

Z: 在最后加上Z表示将提取到的日期时间字符串标记为UTC时间。

date -s: 最后使用date -s命令将提取到的日期时间字符串设为系统日期时间。

总而言之,这段代码的作用是从google.com获取日期和时间信息,然后将其设置为系统的日期和时间。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-12 05:02 , Processed in 0.060584 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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