将文件的访问日期、更改日期和修改日期更改为过去的同一日期

将文件的访问日期、更改日期和修改日期更改为过去的同一日期

对于我正在开发的实用程序,如果我可以将与某个目录中的文件关联的所有三个命名日期设置为过去的某个日期,那将是方便的。

我知道我可以用来touch设置访问和修改日期,但我需要所有三个都相同(用作参考点/日期)。

有什么办法可以做到这一点(root-access ok)

编辑:

  1. 我找到了这个:http://blog.commandlinekungfu.com/2010/02/episode-80-time-bandits.html建议(仅适用于 ext2/3/4):

    # debugfs -w -R 'set_inode_field /pathtofile ctime 200901010101' 文件设备

其中“200901010101”是示例日期时间;和这个https://stackoverflow.com/a/5518031/15161找到上面需要的“文件设备”:

df /pathtofile | awk 'NR == 2 {print $1}'

我已经在测试文件上尝试过此操作,但 debugfs 调用花费了太长时间,我按 Ctrl-C 进行了操作。 (所以我真的不知道这是否有效......)

  1. 另一个想法可能是使用将系统日期设置为我想要的过去日期的虚拟机,但我不知道如何设置。

  2. 这与(2)有关,但不使用VM,来自http://www.shellhacks.com/en/Faking-a-Files-Access-Modify-and-Change-TimeStamps-in-Linux:

作为一种可能的解决方法,您可以将系统时间设置为您想要施加的 ctime,然后触摸该文件,然后恢复系统时间。

NOW=$(date) && date -s "2030-08-15 21:30:11" && touch file.txt && date -s "$NOW"

但我不确定这有多安全/有风险。

答案1

如果不“作弊”,你就无法更改 ctime,而这需要 root 权限。看如何更改文件的“更改”日期?

由于您正在进行测试,因此我会采用虚拟机方法。在虚拟机中运行您的程序。您可以将虚拟机内的系统日期设置为您喜欢的任何值(只是记住不要设置 NTP)。

或者,如果您正在测试一个应用程序(而不是整个系统),您可以通过LD_PRELOAD类似的例子)或 ptrace (更困难,但甚至适用于静态链接的二进制文件)。这并不适合所有场景,这实际上取决于您正在测试的潜在错误类型。libfaketime让您运行一个程序并让它相信它在不同的时间运行;它还可以记住伪造的时间戳,因此您可以利用它而不必编写任何额外的低级代码。

相关内容