Підробка дати для конкретного сеансу оболонки


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
Моє рішення набагато простіше, ніж використання попереднього завантаження бібліотеки, як відповів Кайл Брант, оскільки розташування .so-файлу libfaketime .so дуже специфічне і залежить від розповсюдження Linux та менеджерів пакетів.
абонець

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' дата сб 4 серпня 09:00:47 UTC 2018 , TZ = 'UTC-120: 00' дата вторник 14 серпня 09:01:41 UTC 2018`. Приблизно + - один тиждень.
phil pirozhkov

3

Можливо, ви зможете попередньо завантажити бібліотеку з альтернативною time()реалізацією.


1
Залежно від того, яким чином програма (и) отримують доступ до поточного часу, можливо, вам доведеться попередньо завантажити альтернативні реалізації gettimeofday, clock_gettime та / або, можливо, інші, але так, я раніше використовував цей підхід із успіхом.
Kjetil Joergensen

Це програма Java, і вона, здається, добре працює з libfaketime.
nicoulaj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.