시간을 올바르게 위조하는 방법은 무엇입니까?

시간을 올바르게 위조하는 방법은 무엇입니까?

제가 개발 중인 소프트웨어 프로젝트에서 특정 시간대와 관련된 버그를 해결하기 위해 시스템 시계의 변경 사항을 복사하여 timedatectl소프트웨어의 동작을 확인해 보았습니다.

나는 이것을 실행하여 달성하려고 노력하고 있습니다.

timedatectl set-timezone America/New_York
timedatectl set-local-rtc 1
timedatectl set-ntp false
timedatectl set-time "2017-03-12 01:58:50" && hwclock -w

이 작업을 수행하고 timedatectl즉시 실행하면 예상대로 다음과 같은 시간이 표시됩니다.

Local time: Sun 2017-03-12 01:58:51 EST
Universal time: Sun 2017-03-12 06:58:51 UTC
RTC time: Sun 2017-03-12 01:58:51
Time zone: America/New_York (EST, -0500)
System clock synchronized: no
systemd-timesyncd.service active: no
RTC in local TZ: yes

그러나 10초 후 분이 ( xx:59)로 바뀌면 현지시간과 세계시간이 현재시간으로 "재시작"됩니다.

Local time: Wed 2019-08-07 21:01:41 EDT
Universal time: Thu 2019-08-08 01:01:41 UTC
RTC time: Sun 2017-03-12 01:58:57
Time zone: America/New_York (EDT, -0400)
System clock synchronized: no
systemd-timesyncd.service active: no
RTC in local TZ: yes

내가 여기서 무엇을 놓치고 있는 걸까요?

내 설정은 Vagrant Ubuntu 18 VM(Linux vagrant 4.15.0-51/vm box "bento/ubuntu-18.04")입니다.

답변1

이는 현재 보고 있는 동작을 설명하지는 않지만 제목의 질문에 대한 대답은 되어야 합니다.

시스템 시간을 변경하는 대신 다음과 같은 도구를 사용할 수 있습니다.faketimeTZ환경 변수:

$ date; faketime -f -15d date; TZ=America/New_York faketime -f -15d date
Thu  8 Aug 10:21:13 CEST 2019
Wed 24 Jul 10:21:13 CEST 2019
Wed 24 Jul 04:21:13 EDT 2019

이렇게 하면 시스템의 나머지 부분에 영향을 주지 않고 자신의 시간대, 날짜 및 시간을 사용하여 프로그램을 실행할 수 있습니다.

핵을 사용하여 애플리케이션에 코드를 삽입하기 때문에 $LD_PRELOAD정적으로 링크된 실행 파일이나 setuid/setgid 실행 파일에서는 작동하지 않습니다.

관련 정보