- 需求背景
最近在测试证书相关的工作,有一个场景是生成一个已经过期的,或者证书有效期小于一天的证书。
一开始发现 openssl x509
有参数-startdate/-enddata
,还以为发现了神器,结果一试不行,-startdate/-enddata
只是用作输出参数的,不能用来作输入参数;作为输入参数的只有-days <arg>
指定多少天之后过期,最小单位就是天。
另一个办法就是修改电脑的系统时间,把它调到过去的某个时间点。这个方法当然是可行,只是感觉很重。
网上一通google,发现了这个神器faketime,可以用来为单个命令这是系统时间;其原理就是截获时间相关的系统调用,然后把它设置的时间返回。
- 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
- 使用
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
- 几种时间格式
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/
网友评论