我有一个这样的脚本:
find . -name '*.nar' | while read NARFILE; do
if jar tvf $NARFILE | grep -q jackson-databind; then
OUTPUT=$(jar tvf $NARFILE | grep jackson-databind)
echo $NARFILE':'$OUTPUT
fi
done |
grep '\-2.9.10.jar' |
awk -F':' '{print $1}' | while read NARFILE; do
jar uvf $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar
jar xvf $NARFILE META-INF/DEPENDENCIES
sed -i '/jackson-databind/s/2.9.10$/2.9.10.8/' META-INF/DEPENDENCIES
jar uvf $NARFILE META-INF/DEPENDENCIES
zip -d $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.jar
done
我无法理解这里发生了什么。
到目前为止我的模糊理解:
然后我迷路了。
请帮忙。
这没有任何保证,并带有警告,如果您不信任脚本的来源,您可能不应该执行它,即使您认为您完全理解它的作用。有时,一些看似无害的美好事物,在特定情况下可能是有害的。
话虽这么说,从您提供的内容来看,它似乎(双感叹号)它处理 NAR 文件,就像 Apache NiFi 档案中一样,这些文件用于为 NiFi 处理器提供其自己的一组依赖项和库,这些依赖项和库与其余正在运行的内容。脚本所涉及的此类档案中的两个相关文件是 META-INF/DEPENDENCIES
- 请参阅此answer - 以及
META-INF/bundled-dependencies
目录中的 Jackson Databind jar 文件,其中包含实际将加载和提供的 jar 文件到 NiFi 处理器。请注意,提到的 Jackson 版本都不是最新版本,并且
29.10.8 至少有三个已知漏洞。 (微)Milestone 2.9.10.8 修复了几个漏洞。探索他们的 github 以获取当前版本和更多信息。
步骤:
find . -name '*.nar' | while read NARFILE; do
查找并浏览所有以 .nar 文件结尾的文件。
if jar tvf $NARFILE | grep -q jackson-databind; then
尝试列出当前 .nar 存档文件的内容,并检查是否提及“jackson-databind”(即它是否包含文件)。 grep -q
表示安静,与
if
结合使用,则仅当发现某些内容时才会执行以下操作。换句话说,如果 jackson-databind 没有匹配项,那么它基本上不会返回任何内容,并且会转到循环中的下一个 .nar 文件。
OUTPUT=$(jar tvf $NARFILE | grep jackson-databind)
echo $NARFILE':'$OUTPUT
fi
done |
将匹配项存储在 OUTPUT 中,然后将当前 .nar 文件与此行一起回显并进一步通过管道传输。本质上,这意味着到目前为止,它会遍历所有 .nar 文件,查看内部,如果找到 jackson-databind,则它将 .nar 文件名与 jackson-databind 的行“捆绑”在一起,并将其提供给下一步中的下一步。如果您愿意,可以使用键值对。
grep '\-2.9.10.jar' |
awk -F':' '{print $1}' | while read NARFILE; do
首先它会准过滤 2.9.10.jar,以便匹配包含另一个版本的 jackson-databind 的行,不会执行任何操作。 awk -F':'
然后再次拆开我所说的 .nar 文件的“键值对”并再次行,并为下一步提供 .nar 文件名。
jar uvf $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar
这会使用相对文件路径META-INF/bundled-dependencies/jackson-databind-2.9.10.8.jar
更新.nar存档。因此,这是一个假设位于您的文件系统中的文件,相对于您执行此脚本的位置。
jar xvf $NARFILE META-INF/DEPENDENCIES
sed -i '/jackson-databind/s/2.9.10$/2.9.10.8/' META-INF/DEPENDENCIES
jar uvf $NARFILE META-INF/DEPENDENCIES
提取、编辑、然后使用 *.nar 文件中的 META-INF/DEPENDENCIES 文件的编辑更新存档。编辑:在包含“jackson-databind”的行中,将字符串“2.9.10”交换为“2.9.10.8”,这就是 sed -i (就地编辑)所做的。
zip -d $NARFILE META-INF/bundled-dependencies/jackson-databind-2.9.10.jar
从存档中删除旧的 jackson-databind-2.9.10.jar。简而言之,似乎要做的就是将 NAR 档案中的 Jackson Databind 版本从旧版本更新为较新的旧版本。