Fingir la fecha para una sesión de shell específica

30

Ciertamente estoy tratando de lograr algo extraño aquí, pero quiero fingir la fecha localmente para una sesión de shell en GNU / Linux. Necesito probar el cuadro negro de cómo se comporta un programa en diferentes fechas, y modificar la fecha en todo el sistema puede tener efectos secundarios no deseados (trabajos cron, registros en mal estado, etc.).

Algunas ideas ?

nicoulaj
fuente

Respuestas:

27

Puede usar el ejecutable faketime(desde los repositorios de ubuntu sudo apt-get install faketime):

faketime -f "-15d" date

O incluso tiempo falso en todo el caparazón por

faketime -f "-15d" bash -l
abonec
fuente
1
Kyle Brant publicó más o menos esta respuesta en 2010 . Por favor, editar su respuesta a ampliar en él de alguna manera que hace que sea sustancialmente diferente de las respuestas existentes.
un CVn
55
Mi solución es mucho más fácil que usar la precarga de la biblioteca, como respondió Kyle Brant porque la ubicación del archivo libfaketime .so es muy específica y depende de la distribución de Linux y los administradores de paquetes.
abonec
3
@ MichaelKjörling Esta respuesta no es para nada la misma que la de Kyle Brant.
1
@ MichaelKjörling Esta respuesta es significativamente más fácil que la de Kyle Brant.
Ken Sharp
29

No he probado este todavía. Pero si esto es actual, parece que alguien ya escribió la biblioteca, puede precargar con libfaketime .

El uso básico es:

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

Puede usar ltracepara asegurarse de que todas las funciones de tiempo que utiliza su aplicación estén cubiertas.

Kyle Brandt
fuente
7

Puede establecer la variable TZ en un valor impar.

$ 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
Pausado hasta nuevo aviso.
fuente
1
Truco inteligente, pero solo modifica la zona horaria, por lo que está limitado al rango [-12 horas, + 11 horas].
nicoulaj
1
@nicoulaj date Thu Aug 9 12:12:50 CDT 2018, `TZ = 'UTC + 120: 00' fecha sábado 4 de agosto 09:00:47 UTC 2018 , TZ = 'UTC-120: 00' fecha martes 14 de agosto 09:01:41 UTC 2018`. Aproximadamente + - una semana.
phil pirozhkov
3

Es posible que pueda precargar una biblioteca que tenga una time()implementación alternativa .

Douglas Leeder
fuente
1
Dependiendo de cómo los programas accedan a la hora actual, es posible que deba precargar implementaciones alternativas de gettimeofday, clock_gettime y / o posiblemente otras, pero sí, he usado este enfoque con éxito antes.
Kjetil Joergensen
Es un programa Java, y parece funcionar bien con libfaketime.
nicoulaj