![UNIX ctime:如何在备份(tar)中保存这些宝贵的信息?](https://linux22.com/image/614176/UNIX%20ctime%EF%BC%9A%E5%A6%82%E4%BD%95%E5%9C%A8%E5%A4%87%E4%BB%BD%EF%BC%88tar%EF%BC%89%E4%B8%AD%E4%BF%9D%E5%AD%98%E8%BF%99%E4%BA%9B%E5%AE%9D%E8%B4%B5%E7%9A%84%E4%BF%A1%E6%81%AF%EF%BC%9F.png)
我有三个与文件的“ctime”信息相关的问题。它们分别大胆的(如果您没有时间,可以直接跳到它们)。
我的专用服务器上的一个网站被黑客入侵了。很多文件被编辑了。我注意到有些黑客很聪明,重置了修改时间(有些则不行)。
atime 和 mtime 可以用 PHP 函数更改。ctime 也可以用 chmod 函数更改。但是 ctime 由内核处理,因此只能将其设置为当前系统日期/时间。无法将其设置回过去。
我发现一些后门的 mtime 已被重置为 ctime(过去的日期,比如 1 或 2 年前),因此我无法使用基于该信息的递归搜索工具找到它。
能够快速找到所有受感染文件的关键当然是 ctime 信息。问题是我一开始没有想到这一点,所以我首先递归地“chmoded”所有文件,这样网站本身就不再具有写入权限。这样做,我丢失了宝贵的 ctime 信息。
我有很多备份,以 .tar.gz 文件的形式。我想知道是否有办法从 tar.gz 文件中提取文件的 ctime当他们被添加到焦油中时。
我阅读了整个 GNU tar 文档,发现 tar 的“GNU”格式(这是我的 Linux 服务器使用的默认格式)存储了其存档文件的 ctime。我尝试了以下方法来提取它:
tar -zxf Friday.tar.gz --to-command=./script
./script 是一个 bash 脚本,如下所示:
#!/bin/bash
echo $TAR_CTIME
问题是,这给出了当前的日期和时间,可能是因为 tar 给出了如果我没有使用它会自己创建的文件的信息--to-command
如果 tar 无法处理这个问题,是否有可以保留原始 ctime 信息的备份工具?
如何列出每个 mtime 和 ctime 不同的文件?我阅读了 find 手册,但只发现了-newerXY
,它(如果我理解得没错的话)只能比较 ctime 与 ctime、mtime 与 mtime 等等。有没有办法比较同一个文件的 ctime 和 mtime?
答案1
ctime 由内核控制,而不是任何用户空间工具、tar 或任何其他程序,因为要备份和恢复,它们必须创建一个新的 inode,该 inode 必须具有新的 ctime。一种已知的保存方法是将文件系统映像到环回文件,然后保存该映像。除非您的文件系统已满并且您确实想保存整个文件系统,否则这非常浪费。
有更高效的程序,例如 partimage,但我还没有检查它们是否保存了 inode 的 ctime。
答案2
您是否考虑过使用 tar 比较选项来查看哪些文件已更改?这应该会为您提供一个候选列表。
答案3
星星和埃克斯塔格式(带有 POSIX.1-2001 扩展头的 tar)存储所有 3 个时间戳:
$ stat 3times
File: '3times'
Size: 7 Blocks: 8 IO Block: 4096 regular file
Device: 13h/19d Inode: 20209028 Links: 1
Access: (0400/-r--------) Uid: ( 1000/ gotar) Gid: ( 1000/ users)
Access: 2021-07-15 12:31:53.085946972 +0200
Modify: 2021-07-15 12:32:10.049040551 +0200
Change: 2021-07-15 12:32:16.435616907 +0200
Birth: -
$ star artype=exustar 3times -c > 3times.star
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
$ grep -a time= 3times.star | strings
[...]
30 atime=1626345113.085946972
30 ctime=1626345136.435616907
30 mtime=1626345130.049040551
[...]
$ perl -E 'say scalar localtime 1626345113; say scalar localtime 1626345136; say scalar localtime 1626345130'
Thu Jul 15 12:31:53 2021
Thu Jul 15 12:32:16 2021
Thu Jul 15 12:32:10 2021
和在某些条件下可以恢复。或者或多或少粗略地提取(如上)。