当我遇到这个命令时,我正在清理以前的开发人员在Linux机器上创建的脚本代码:
find / -xdev -type f | egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs" | xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\ -f1
我试图完全弄清楚该命令的每个部分到底起什么作用,但是 grep 部分让我感到困惑。
我知道输出本质上是文件系统的校验和值,但我需要确切知道它是如何执行此操作的。
谢谢。
答案1
慢动作:
egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs"
egrep
意味着我们正在使用 ERE(扩展正则表达式)- -v 反转选择(保留不匹配的内容)
- 对
|
各种表达式进行“或”运算 ^
是“行首”匹配
因此,它会删除以 等开头的行... /etc/shadow
,/etc/random-seed
从而将文件从这些目录中排除。
因此从整体上来说:
- 仅在文件系统中查找所有文件
/
(由于-xdev
),因此这会排除/proc
例如可能的其他文件系统(考虑到其余的,我不会惊讶于它/var
是一个单独的 FS),并过滤掉特定的目录,如上所示。 - 计算所有这些文件的 MD5 哈希值(
xargs md5sum
) - 稍微调整一下哈希列表
- 计算 MD5 哈希值列表的 MD5 哈希值
md5sum | cut -d\ -f1
换句话说,它计算磁盘上所有文件的组合哈希值,可能是为了检查自上次计算以来是否没有任何变化(这就是为什么我会惊讶于 /var
被考虑在内,因为它的内容会随着时间而变化:/var/log
,,/var/mail
... /var/lib
)
答案2
xenoid 的回答是有效的,所以我就不再重复了。由于 lukemk1 在上面关于这部分的评论中要求澄清一些问题,因此还需要澄清一些问题:| xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\ -f1
“| xargs md5sum”:允许您应用 md5sum 命令,其参数是所有管道文件名(这里可能有点复杂)。
“2> /dev/null” :表示丢弃 stderr 流
“| tr -s "[:space:]" ":(根据“man tr” [:space:] 表示所有水平或垂直空格,并且 -s 标志(--squeeze-repeats)挤压这种类型空格的连续重复。
“| md5sum” :获取 md5sum 流的 md5sum
“| cut -d\ -f1 ” :使用空格(“\”)作为分隔符字段,仅打印第一个字段(实际上只是 md5sum 数字)
这不是问题的一部分,但我发现整个命令的一个问题是,如果文件名中有空格,它将无法按预期工作;要纠正,您需要使用 find ... -print0 | ....| xargs -0 ....