伪造特定 shell 会话的日期

nic*_*laj 40 linux unix shell time unix-shell

我当然想在这里实现一些奇怪的东西,但我想在 GNU/Linux 上为 shell 会话在本地伪造日期。我需要对程序在不同日期的行为进行黑盒测试,修改系统范围的日期可能会产生不需要的副作用(cron 作业、混乱的日志等)。

有任何想法吗 ?

abo*_*nec 40

您可以通过以下方式使用可执行文件faketime(来自 ubuntu 存储库sudo apt-get install faketime):

faketime -f "-15d" date
Run Code Online (Sandbox Code Playgroud)

甚至在整个外壳中伪造时间

faketime -f "-15d" bash -l
Run Code Online (Sandbox Code Playgroud)

  • 我的解决方案比 Kyle Brant 回答的使用库预加载容易得多,因为 libfaketime .so 文件的位置非常具体,取决于 linux 发行版和包管理器。 (5认同)
  • @MichaelKjörling 这个答案与凯尔布兰特的完全不同。 (3认同)

Kyl*_*ndt 30

这个还没试过。但是,如果这是当前看起来有人已经编写了库,您可以使用libfaketime进行预加载。

基本用法是:

user@host> LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d" date
Mon Nov  8 12:01:12 CEST 2007
Run Code Online (Sandbox Code Playgroud)

您可以使用它ltrace来确保您的应用程序使用的所有时间函数都被覆盖。


Den*_*son 7

您可以将 TZ 变量设置为一个奇怪的值。

$ date
Tue May  4 06:24:43 CDT 2010
$ date -u
Tue May  4 11:24:47 UTC 2010
$ export TZ='CDT-3:12'
$ date
Tue May  4 14:36:53 CDT 2010
$ export TZ='CDT+5:37'
$ date
Tue May  4 05:48:00 CDT 2010
Run Code Online (Sandbox Code Playgroud)

  • @nicoulaj `date Thu Aug 9 12:12:50 CDT 2018`,` TZ='UTC+120:00' 日期 2018 年 8 月 4 日星期六 09:00:47 UTC`,`TZ='UTC-120:00' 日期UTC 2018 年 8 月 14 日星期二 09:01:41`。大约 +- 一周。 (2认同)