Udawanie daty konkretnej sesji powłoki

30

Z pewnością staram się tutaj osiągnąć coś dziwnego, ale chcę lokalnie sfałszować datę sesji powłoki w systemie GNU / Linux. Muszę przetestować czarną skrzynkę, jak program zachowuje się w różnych terminach, a modyfikacja daty systemowej może mieć niepożądane skutki uboczne (zadania crona, pomieszane logi itp.).

Jakieś pomysły ?

nicoulaj
źródło

Odpowiedzi:

27

Możesz po prostu użyć pliku wykonywalnego faketime(z repozytoriów ubuntu sudo apt-get install faketime) przez:

faketime -f "-15d" date

Lub nawet fałszywy czas w całej skorupce

faketime -f "-15d" bash -l
abonec
źródło
1
Kyle Brant opublikował prawie tę odpowiedź w 2010 roku . Proszę edytować swoją odpowiedź, aby rozwinąć na niej w jakiś sposób, który sprawia, że znacznie różni się od dotychczasowych odpowiedzi.
CVn
5
Moje rozwiązanie jest znacznie łatwiejsze niż korzystanie z wstępnego ładowania bibliotek, ponieważ Kyle Brant odpowiedział, ponieważ lokalizacja pliku .so libfaketime jest bardzo specyficzna i zależy od dystrybucji linuksa i menedżerów pakietów.
abonec
3
@ MichaelKjörling Ta odpowiedź wcale nie jest taka sama jak Kyle Brant.
1
@ MichaelKjörling Ta odpowiedź jest znacznie łatwiejsza niż odpowiedź Kyle'a Brant'a.
Ken Sharp,
29

Jeszcze tego nie wypróbowałem. Ale jeśli jest to aktualne, wygląda na to, że ktoś już napisał bibliotekę, którą można wstępnie załadować z libfaketime .

Podstawowym zastosowaniem jest:

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

Możesz użyć, ltraceaby upewnić się, że wszystkie funkcje czasowe używane przez aplikację są objęte gwarancją.

Kyle Brandt
źródło
7

Możesz ustawić zmienną TZ na nieparzystą wartość.

$ 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
Wstrzymano do odwołania.
źródło
1
Sprytna sztuczka, ale modyfikuje ona tylko strefę czasową, więc w ten sposób jesteś ograniczony do zakresu [-12 godzin, + 11 godzin].
nicoulaj
1
@nicoulaj date Thu Aug 9 12:12:50 CDT 2018, data „TZ = 'UTC + 120: 00” sob. 4 sierpnia 09:00:47 UTC 2018 , TZ = data „UTC-120: 00” wtorek 14 09:01:41 UTC 2018`. Z grubsza + - jeden tydzień.
phil pirozhkov,
3

Być może będziesz mógł wstępnie załadować bibliotekę, która ma alternatywną time()implementację.

Douglas Leeder
źródło
1
W zależności od tego, w jaki sposób program (programy) uzyskuje dostęp do aktualnego czasu, może być konieczne wstępne załadowanie alternatywnych implementacji gettimeofday, clock_gettime i / lub ewentualnie innych, ale tak, wcześniej z powodzeniem stosowałem to podejście.
Kjetil Joergensen
Jest to program Java i wydaje się, że działa dobrze z libfaketime.
nicoulaj