如何正确伪造时间?

如何正确伪造时间?

为了解决我正在开发的软件项目中与特定时区相关的错误,我尝试复制系统时钟上的更改来timedatectl检查我的软件行为。

我试图通过跑步来实现这一目标

timedatectl set-timezone America/New_York
timedatectl set-local-rtc 1
timedatectl set-ntp false
timedatectl set-time "2017-03-12 01:58:50" && hwclock -w

当我这样做并timedatectl立即运行时,我得到了预期的以下时间:

Local time: Sun 2017-03-12 01:58:51 EST
Universal time: Sun 2017-03-12 06:58:51 UTC
RTC time: Sun 2017-03-12 01:58:51
Time zone: America/New_York (EST, -0500)
System clock synchronized: no
systemd-timesyncd.service active: no
RTC in local TZ: yes

然而,10 秒后,当分钟更改为 ( xx:59) 时,本地时间和世界时间会“重新启动”为当前时间

Local time: Wed 2019-08-07 21:01:41 EDT
Universal time: Thu 2019-08-08 01:01:41 UTC
RTC time: Sun 2017-03-12 01:58:57
Time zone: America/New_York (EDT, -0400)
System clock synchronized: no
systemd-timesyncd.service active: no
RTC in local TZ: yes

我在这里缺少什么?

我的设置是 Vagrant Ubuntu 18 VM(Linux vagrant 4.15.0-51 / vm box“bento/ubuntu-18.04”)。

答案1

这不会解释您所看到的行为,但它应该回答标题中的问题。

您可以使用诸如以下的工具,而不是更改系统时间faketimeTZ环境变量:

$ date; faketime -f -15d date; TZ=America/New_York faketime -f -15d date
Thu  8 Aug 10:21:13 CEST 2019
Wed 24 Jul 10:21:13 CEST 2019
Wed 24 Jul 04:21:13 EDT 2019

这将允许您使用自己的时区、日期和时间运行程序,而不会影响系统的其余部分。

请注意,由于它使用$LD_PRELOADhack 在应用程序中注入代码,因此它不适用于静态链接的可执行文件或 setuid/setgid 可执行文件。

相关内容