Fake the date for a specific shell session

30

J'essaie certainement de réaliser quelque chose de bizarre ici, mais je veux truquer la date localement pour une session shell sur GNU / Linux. Je dois tester en boîte noire comment un programme se comporte à différentes dates, et la modification de la date à l'échelle du système peut avoir des effets secondaires indésirables (tâches cron, journaux foirés, etc.).

Des idées ?

nicoulaj
la source

Réponses:

27

Vous pouvez simplement utiliser l'exécutable faketime(à partir des référentiels ubuntu sudo apt-get install faketime) en:

faketime -f "-15d" date

Ou même de faux temps en coquille entière par

faketime -f "-15d" bash -l
abonec
la source
1
Kyle Brant a publié à peu près cette réponse en 2010 . Veuillez modifier votre réponse pour la développer d'une manière qui la rend sensiblement différente des réponses existantes.
un CVn le
5
Ma solution est beaucoup plus facile que d'utiliser le préchargement de bibliothèque comme l'a répondu Kyle Brant car l'emplacement du fichier libfaketime .so est très spécifique et dépend de la distribution Linux et des gestionnaires de paquets.
abonec
3
@ MichaelKjörling Cette réponse n'est pas du tout la même que celle de Kyle Brant.
1
@ MichaelKjörling Cette réponse est beaucoup plus simple que celle de Kyle Brant.
Ken Sharp
29

Je n'ai pas encore essayé celui-ci. Mais si c'est le cas, il semblerait que quelqu'un ait déjà écrit la bibliothèque que vous pouvez précharger avec libfaketime .

L'utilisation de base est:

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

Vous pouvez utiliser ltracepour vous assurer que toutes les fonctions horaires utilisées par votre application sont couvertes.

Kyle Brandt
la source
7

Vous pouvez définir la variable TZ sur une valeur excentrique.

$ 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
En pause jusqu'à nouvel ordre.
la source
1
Astuce astucieuse, mais elle ne modifie que le fuseau horaire, de cette façon, vous êtes limité à [-12 heures, + 11 heures].
nicoulaj
1
@nicoulaj date Thu Aug 9 12:12:50 CDT 2018, `TZ = 'UTC + 120: 00' date sam août 4 09:00:47 UTC 2018 , TZ = 'UTC-120: 00' date mar 14 août 09:01:41 UTC 2018 '. Environ + - une semaine.
phil pirozhkov
3

Vous pourrez peut-être précharger une bibliothèque qui a une time()implémentation alternative .

Douglas Leeder
la source
1
En fonction de la façon dont le ou les programmes accèdent à l'heure actuelle, vous devrez peut-être précharger d'autres implémentations de gettimeofday, clock_gettime et / ou éventuellement d'autres, mais oui, j'ai déjà utilisé cette approche avec succès auparavant.
Kjetil Joergensen
C'est un programme Java, et il semble bien fonctionner avec libfaketime.
nicoulaj