特定のシェルセッションの日付を偽造する


30

私は確かにここで何か変なことをしようとしていますが、GNU / Linuxでのシェルセッションの日付をローカルで偽造したいと思います。プログラムが異なる日付でどのように動作するかをブラックボックスでテストする必要があり、システム全体の日付を変更すると、望ましくない副作用(cronジョブ、混乱したログなど)が発生する可能性があります。

何か案は ?

回答:


27

次の方法で、実行可能ファイルfaketime(ubuntuリポジトリからsudo apt-get install faketime)を使用できます。

faketime -f "-15d" date

または、シェル全体で偽の時間を

faketime -f "-15d" bash -l

1
カイル・ブラントは2010年にこの回答をほぼ投稿しました。回答を編集して、既存の回答と大幅に異なる何らかの方法で回答を拡大してください。
CVn

5
libfaketime .soファイルの場所は非常に具体的であり、Linuxディストリビューションとパッケージマネージャーに依存するため、Kyle Brantが答えたように、私のソリューションはライブラリプリロードを使用するよりもはるかに簡単です。
abonec

3
@MichaelKjörlingこの答えは、カイル・ブラントの答えとまったく同じではありません。

1
@MichaelKjörlingこの答えは、カイル・ブラントよりもはるかに簡単です。
ケンシャープ

29

これはまだ試していない。しかし、これが最新の場合は、誰かがすでにライブラリを作成しているように見えるので、libfaketimeでプリロードできます。

基本的な使用法は次のとおりです。

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

を使用ltraceして、アプリケーションが使用するすべての時間機能を確実にカバーできます。


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

1
巧妙なトリックですが、タイムゾーンを変更するだけなので、この方法では[-12時間、+ 11時間]の範囲に制限されます。
nicoulaj

1
@nicoulaj date Thu Aug 9 12:12:50 CDT 2018、 `TZ = 'UTC + 120:00'日付8月4日(土)09:00:47 UTC 2018 , TZ = 'UTC-120:00'日付8月14日09:01:41 UTC 2018`。およそ+-1週間。
フィルピロシコフ

3

代替time()実装を持つライブラリをプリロードできる場合があります。


1
プログラムが現在の時間にどのようにアクセスするかに応じて、gettimeofday、clock_gettime、および/またはその他の代替実装をプリロードする必要があるかもしれませんが、はい、私は以前にこのアプローチを成功裏に使用しました。
はKjetil Joergensen

これはJavaプログラムであり、libfaketimeでうまく機能するようです。
ニコライ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.