Memalsukan tanggal untuk sesi shell tertentu

30

Saya tentu mencoba untuk mencapai sesuatu yang aneh di sini, tetapi saya ingin memalsukan tanggal secara lokal untuk sesi shell di GNU / Linux. Saya perlu menguji black-box bagaimana suatu program berperilaku pada tanggal yang berbeda, dan memodifikasi tanggal sistem secara keseluruhan dapat memiliki efek samping yang tidak diinginkan (pekerjaan cron, log yang berantakan, dll).

Ada ide?

nicoulaj
sumber

Jawaban:

27

Anda bisa menggunakan executable faketime(dari repositori ubuntu sudo apt-get install faketime) dengan:

faketime -f "-15d" date

Atau bahkan waktu palsu di seluruh kulit oleh

faketime -f "-15d" bash -l
abonec
sumber
1
Kyle Brant memposting cukup banyak jawaban ini kembali pada tahun 2010 . Harap edit jawaban Anda untuk mengembangkannya dengan cara yang membuatnya jauh berbeda dari jawaban yang ada.
CVn
5
Solusi saya jauh lebih mudah daripada menggunakan preload perpustakaan sebagai jawaban Kyle Brant karena lokasi file libfaketime .so sangat spesifik dan tergantung pada distribusi linux dan manajer paket.
abonec
3
@ MichaelKjörling Jawaban ini sama sekali tidak sama dengan Kyle Brant.
1
@ MichaelKjörling Jawaban ini jauh lebih mudah daripada Kyle Brant.
Ken Sharp
29

Belum mencoba yang ini. Tetapi jika ini adalah saat ini sepertinya seseorang sudah menulis perpustakaan Anda dapat preload dengan libfaketime .

Penggunaan dasar adalah:

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

Anda dapat menggunakan ltraceuntuk memastikan semua fungsi waktu yang digunakan aplikasi Anda tercakup.

Kyle Brandt
sumber
7

Anda dapat mengatur variabel TZ ke nilai eksentrik.

$ 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
Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
Trik cerdas, tetapi hanya mengubah zona waktu, jadi dengan cara ini Anda dibatasi pada rentang [-12 jam, + 11 jam].
nicoulaj
1
@nicoulaj date Thu Aug 9 12:12:50 CDT 2018, `TZ = 'UTC + 120: 00' tanggal Sat 4 Agustus 09:00:47 UTC 2018 , TZ = 'UTC-120: 00' tanggal Sel 14 Agustus 09:01:41 UTC 2018`. Sekitar + - satu minggu.
phil pirozhkov
3

Anda mungkin dapat melakukan pramuat perpustakaan yang memiliki time()implementasi alternatif .

Douglas Leeder
sumber
1
Bergantung pada bagaimana program mengakses waktu saat ini, Anda mungkin harus melakukan preload implementasi alternatif gettimeofday, clock_gettime, dan / atau mungkin yang lain juga, tapi ya, saya telah menggunakan pendekatan ini dengan sukses sebelumnya.
Kjetil Joergensen
Ini adalah program Java, dan sepertinya bekerja dengan baik dengan libfaketime.
nicoulaj