介绍一个神器faketime

  1. 需求背景

最近在测试证书相关的工作,有一个场景是生成一个已经过期的,或者证书有效期小于一天的证书。

一开始发现 openssl x509有参数-startdate/-enddata,还以为发现了神器,结果一试不行,-startdate/-enddata只是用作输出参数的,不能用来作输入参数;作为输入参数的只有-days 指定多少天之后过期,最小单位就是天。

另一个办法就是修改电脑的系统时间,把它调到过去的某个时间点。这个方法当然是可行,只是感觉很重。

网上一通google,发现了这个神器faketime,可以用来为单个命令这是系统时间;其原理就是截获时间相关的系统调用,然后把它设置的时间返回。

  1. faketime的安装
$ git clone https://github.com/wolfcw/libfaketime.git
$ cd libfaketime
$ PREFIX=/path/to/install/destination make
$ PREFIX=/path/to/install/destination make install

如果没有指定PREFIX,则缺省安装到/usr/local目录下,当然需要root权限

编译完之后,只是生成下面两个文件:

PREFIX/lib/faketime/libfaketime.so.1
PREFIX/bin/faketime
  1. 使用

bin/faketime是对libfaketime.so.1的一个wrapper,可以方便使用:

$ bin/faketime 'last friday 5 pm' /bin/date
$ bin/faketime '2008-12-24 08:15:42' /bin/date
$ bin/faketime -f '-10d' date

直接使用libfaketime.so.1

$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="-10d" date
$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="2008-12-24 08:15:42" date
  1. 几种时间格式

4.1 绝对时间

格式 "YYYY-MM-DD hh:mm:ss"

绝对时间是不会变的,任何时候去取时间都是得到这个值。

$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="2020-01-01 01:01:01" /bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020

4.2 开始时间
格式 "@YYYY-MM-DD hh:mm:ss",和绝对时间相比,多了一个@符号。

$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="@2020-01-01 01:01:01" /bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:01 PST 2020
$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="@2020-01-01 01:01:01" FAKETIME_DONT_RESET=1 /bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
Wed Jan  1 01:01:01 PST 2020
Wed Jan  1 01:01:02 PST 2020
Wed Jan  1 01:01:03 PST 2020
Wed Jan  1 01:01:04 PST 2020
Wed Jan  1 01:01:05 PST 2020

4.3 相对时间

格式"(+|-)(0-9)+[d|h|m|s|...]"

$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="-1d" /bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
Wed Jun 23 12:11:39 PDT 2021
Wed Jun 23 12:11:40 PDT 2021
Wed Jun 23 12:11:41 PDT 2021
Wed Jun 23 12:11:42 PDT 2021
Wed Jun 23 12:11:43 PDT 2021
$ LD_PRELOAD=lib/faketime/libfaketime.so.1 FAKETIME="-1d" FAKETIME_DONT_RESET=1 /bin/bash -c 'while [ $SECONDS -lt 5 ]; do date; sleep 1; done'
Wed Jun 23 12:11:23 PDT 2021
Wed Jun 23 12:11:24 PDT 2021
Wed Jun 23 12:11:25 PDT 2021
Wed Jun 23 12:11:26 PDT 2021
Wed Jun 23 12:11:27 PDT 2021

详细格式可以参考文档本身:
https://github.com/wolfcw/libfaketime/

  1. 注意点

既然这个工具的逻辑是用LD_PRELOAD来实现的,那么对于不使用LD_PRELOAD机制的程序就没法用了,比如静态链接的程序,或者go语言编译的程序。

你可能感兴趣的:(介绍一个神器faketime)