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 ?

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

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.


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

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 .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.