Fingindo a data para uma sessão shell específica

30

Certamente estou tentando conseguir algo estranho aqui, mas quero falsificar a data localmente para uma sessão de shell no GNU / Linux. Preciso testar na caixa preta como um programa se comporta em datas diferentes e a modificação da data em todo o sistema pode ter efeitos colaterais indesejados (tarefas cron, logs desarrumados etc.).

Alguma ideia ?

nicoulaj
fonte

Respostas:

27

Você pode apenas usar executável faketime(dos repositórios do ubuntu sudo apt-get install faketime):

faketime -f "-15d" date

Ou até mesmo tempo falso em toda a concha,

faketime -f "-15d" bash -l
abonec
fonte
1
Kyle Brant postou praticamente essa resposta em 2010 . Por favor edite sua resposta para expandi-la de alguma forma que faz com que seja substancialmente diferente das respostas existentes.
a CVn
5
Minha solução é muito mais fácil do que usar o pré-carregamento da biblioteca, como respondeu Kyle Brant, porque a localização do arquivo libfaketime .so é muito específica e depende da distribuição do linux e dos gerenciadores de pacotes.
abonec
3
@ MichaelKjörling Esta resposta não é a mesma que a de Kyle Brant.
1
@ MichaelKjörling Esta resposta é significativamente mais fácil que a de Kyle Brant.
Ken afiada
29

Ainda não tentei este. Mas se isso é atual, parece que alguém já escreveu a biblioteca, você pode pré-carregar com a libfaketime .

O uso básico é:

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

Você pode usar ltracepara garantir que todas as funções de tempo que seu aplicativo use sejam cobertas.

Kyle Brandt
fonte
7

Você pode definir a variável TZ para um valor ímpar.

$ 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 até novo aviso.
fonte
1
Truque inteligente, mas apenas modifica o fuso horário; portanto, você está limitado ao intervalo [-12 horas, + 11 horas].
Nicoulaj #
1
@nicoulaj date Thu Aug 9 12:12:50 CDT 2018, `TZ = 'UTC + 120: 00' data Sáb 4 de agosto 09:00:47 UTC 2018 , TZ = 'UTC-120: 00' data Terça-feira 14 09:01:41 UTC 2018`. Aproximadamente + - uma semana.
phil Pirozhkov
3

Você pode pré-carregar uma biblioteca que possui uma time()implementação alternativa .

Douglas Leeder
fonte
1
Dependendo de como o (s) programa (s) acessa (s) a hora atual, pode ser necessário pré-carregar implementações alternativas de gettimeofday, clock_gettime e / ou possivelmente outras também, mas sim, eu já usei essa abordagem com êxito antes.
Kjetil Joergensen
É um programa Java e parece funcionar bem com libfaketime.
Nicoulaj