Подделка даты для определенного сеанса оболочки

30

Я, конечно, пытаюсь достичь чего-то странного здесь, но я хочу подделать дату локально для сеанса оболочки в GNU / Linux. Мне нужно проверить «черный ящик», как программа ведет себя в разные даты, и изменение общесистемной даты может иметь нежелательные побочные эффекты (задания cron, испорченные журналы и т. Д.).

Любые идеи ?

nicoulaj
источник

Ответы:

27

Вы можете просто использовать исполняемый файл faketime(из репозиториев Ubuntu sudo apt-get install faketime):

faketime -f "-15d" date

Или даже фальшивое время во всей раковине

faketime -f "-15d" bash -l
abonec
источник
1
Кайл Брант опубликовал этот ответ еще в 2010 году . Пожалуйста, отредактируйте свой ответ, чтобы расширить его таким образом, чтобы он существенно отличался от существующих ответов.
CVN
5
Мое решение намного проще, чем использование предварительной загрузки библиотеки, как ответил Кайл Брант, потому что расположение файла .so libfaketime очень специфично и зависит от дистрибутива linux и менеджеров пакетов.
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' дата сб 4 августа 09:00:47 UTC 2018 , TZ = 'UTC-120: 00' дата вт 14 авг 09:01:41 UTC 2018`. Примерно + - одна неделя.
Фил Пирожков
3

Возможно, вы сможете предварительно загрузить библиотеку, которая имеет альтернативную time()реализацию.

Дуглас Лидер
источник
1
В зависимости от того, как программы (ы) обращаются к текущему времени, вам, возможно, придется предварительно загружать альтернативные реализации gettimeofday, clock_gettime и / или, возможно, других, но да, я раньше успешно использовал этот подход.
Кжетил Йоргенсен
Это Java-программа, и, похоже, она хорошо работает с libfaketime.
nicoulaj