有没有什么办法可以查出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
是可以存储在git
、mercurial
或存储库中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 add
和git commit
)或者改变主意并带回最新的提交:
# git checkout 2d0fabf90f2bc639d30bca925147fafd3fbd5e50 apache2/apache2.conf
# git help status
#
答案4
您可能正在寻找入侵检测系统(IDS)。一些 IDS 会定期检查系统上的所有文件,并提醒您意外的更改。典型的例子是tripwire
,但我一直收到 403Tripwire.org过去八个小时。
此类系统通常只记住文件的校验和,因此要了解发生了什么变化,您需要与备份进行比较。