tldr:gitmeoutofhere

tldr:gitmeoutofhere

有没有什么办法可以查出Linux中哪些文件内容被修改或者添加了。我知道 atime、ctime、mtime。假设我创建了一个脚本“myscript.sh”,有人更改了其中的一些内容,例如添加了几行代码或删除了。我想知道自文件创建以来哪些内容发生了更改?

有什么想法吗?

答案1

您可以通过 VCS 方式执行此操作git
首先,安装 git (它应该是预安装的,如果没有,你的包管理器应该有它)
对于 Debian 系统:sudo apt-get install git
然后,创建一个目录来保存你的文件 ( mkdir myDir)
进入该目录,然后运行git init​​. (这将创建一个本地 Git 存储库)。
将文件添加到目录中,然后运行git add -f *​​.
现在,您可以运行git commit -m "file before editing"以按原样保存文件。
您可以运行git status查看文件是否已被编辑。它会显示类似以下内容:

modified: myFile.txt

如果你想将文件回滚到上次运行时git commit,你可以运行git reset --hard HEAD^。这将强制本地存储库返回到上次提交。

您可以使用 保存对文件的新更改git commit,如下所示:

git commit -m "added 4 lines"

如果您想查看提交列表(及其消息),您可以运行git log.


VCS 就是为此而设计的,这就是我在回答中使用它的原因。

答案2

通常 Unix 中没有内置任何工具(或者更确切地说,没有像 Unix 这样最常见的文件系统中内置任何工具)正在/曾经在 OpenVMS 上),因此您不能期望检索文件的早期版本。

最简单的解决方案是保留您想要“监视”的文件的个人副本,然后定期运行diff这些文件以及系统上安装的副本。

下一步是将文件保存在某种版本控制系统中。在 Unix 上最容易获得的通常是RCS这是非常基本的,但正如其上所说的那样。

git更复杂,但如果这仅涉及一个或少数文件,则可能会太麻烦(RCS 处理单个文件,并且没有属于在一起的许多文件的“存储库”概念)。

答案3

根据您对 @SahibPrime 的回答的评论,您应该使用等等管理员

从主页:

etckeeper/etc是可以存储在gitmercurial或存储库中bazaar的工具集合darcs。这使您可以使用 git 来查看或恢复对 /etc 所做的更改。或者甚至将存储库推送到其他地方以进行备份或选择性配置更改。

它与包管理器挂钩,例如apt自动提交/etc包升级期间所做的更改。它跟踪 git 通常不支持的文件元数据,但这对 /etc 很重要,例如 /etc/shadow 的权限。

它非常模块化和可配置,而且如果您了解版本控制的基础知识,那么使用起来也很简单。

SahibPrime 没有提到的一件事是,您可以用来git diff查看当前和/或任何以前提交的版本之间所做的更改,以及进行这些更改的时间。您还可以轻松恢复到任何修订控制文件的任何先前版本。

至少在 Debian 上,它每天从 cron 运行,因此您甚至不需要记住提交更改。几乎可以肯定它也从其他发行版上的 cron 运行。

安装它并完全忘记它,直到您需要它为止。无需维护。

您还可以使用git(或任何其他类似软件)来跟踪 /usr/local 中的更改。我曾经在 /etc 以及 /usr/local/{s,}bin/ 和 ~/bin 等目录中使用 RCS 多年。后来我改用了svn. etckeeper并且git更好。


tldr:gitmeoutofhere

apt我一定是在 2012 年切换到 etckeeper。从那时起,我就有了每次更改的修订历史记录(至少每天以及每次安装或升级之前/之后)。

# git log | tail -5 
commit 7e3bb0eade7ae9e211bb684be2e3c7d4a3128c24
Author: ...my.email.address.deleted...
Date:   Wed Feb 29 12:53:30 2012 +1100

    Initial commit

# git log | grep '^commit' | wc -l
1378

我几乎不需要看它或思考它,甚至不需要记住它的存在,但当我需要它时,它就在那里无价。我可以撤消我可能做的任何愚蠢的事情,并立即恢复任何配置文件的已知工作和良好版本。

以下是我可以使用配置文件的所有修订历史记录执行的一些操作:

我可以看到特定文件的提交列表:

# git log apache2/apache2.conf | sed -ne 's/commit //p'  | head
2d0fabf90f2bc639d30bca925147fafd3fbd5e50
8022c7ca6dbe1661064604a646c52ca0d1f1b3ac
0620c88b8d1fd625f74f42059a4e8f056846df16
8c2fcfef72eca034b251654be44a268e92e39416
02329cf86655a2bb2c09c793b1d195a4de579cf1
5e449105f0ab75f9e903d8c75af5c8db6543c281
d8339212967af2c664b0c1776e9352f6c0e12ff8
7e3bb0eade7ae9e211bb684be2e3c7d4a3128c24

我可以看到这些提交何时发生:

# git log 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac | head -5
commit 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac
Author: ...
Date:   Tue Aug 20 12:26:53 2013 +1000

    committing changes in /etc after apt run

我可以看到差异:

# git diff 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac apache2/apache2.conf
diff --git a/apache2/apache2.conf b/apache2/apache2.conf
index baf6d8a..617152c 100644
--- a/apache2/apache2.conf
+++ b/apache2/apache2.conf
@@ -71,7 +71,7 @@
 #
 # The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
 #
-Mutex file:${APACHE_LOCK_DIR} default
+#Mutex file:${APACHE_LOCK_DIR} default

 #
 # PidFile: The file in which the server should record its process

我可以将任何内容和/或所有内容恢复到任何以前的版本。最有用的是单个文件的恢复:

# git checkout 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac apache2/apache2.conf
# git diff 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac apache2/apache2.conf
#

我可以看到自上次提交以来发生变化的文件列表:

# git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   apache2/apache2.conf

no changes added to commit (use "git add" and/or "git commit -a")

如果我愿意,我可以再次提交(使用git addgit commit)或者改变主意并带回最新的提交:

# git checkout 2d0fabf90f2bc639d30bca925147fafd3fbd5e50 apache2/apache2.conf
# git help status
# 

答案4

您可能正在寻找入侵检测系统(IDS)。一些 IDS 会定期检查系统上的所有文件,并提醒您意外的更改。典型的例子是tripwire,但我一直收到 403Tripwire.org过去八个小时。

此类系统通常只记住文件的校验和,因此要了解发生了什么变化,您需要与备份进行比较。

相关内容