我正在尝试将价值约 20 年的 Usenet 档案上传到 archive.org,但我的第一批档案被拒绝了,因为一些档案包含以 base64 编码的木马。由于我有大约 400GB 的文件要处理,因此手动修复是不可能的。所有文件均为 mbox 格式,即纯文本。我的第一个想法是查找并替换 mbox 文件中包含“Content-Type: application/x-msdownload”的所有消息。那可能相当困难。我现在认为更简单的蛮力方法是删除所有 base64 块。
从这个问题中,我看到可以使用 grep 找到 base64 块,但我不知道如何使用 sed 设置相同的东西,这就是我要问的原因。谢谢!
编辑:到目前为止我尝试过的
根据这个页面,^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
应该是查找base64文本所需的正则表达式,但是当我尝试将它与sed一起使用时,它实际上并没有工作,或者至少它没有达到我的预期。
例子:
cat clari.local.california.sfbay.biz.mbox | sed -e '#^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$#d' > clari.local.california.sfbay.biz.mbox.test
clari.local.california.sfbay.biz.mbox.test 仍然包含 base64 文本。
邮件用户代理 (MUA) 可以按 MIME 类型从
mutt
邮箱中删除邮件。你甚至可以编写脚本。带有编码附件的邮件可以
mutt
与搜索表达式匹配~M application
。这匹配任何包含 MIME 类型的消息,该类型包含 stringapplication
,通常表示附件已编码(可能在 base64 中)。application/x-msdownload
如果您愿意,您显然可以使用更具体的。如果邮箱被调用,您可以从命令行
messages.mbox
中删除其中包含包含字符串的任何附件的所有邮件,如下所示:application
请注意,这在从邮箱中删除消息之前不会要求任何确认(最后是对退出前是否删除消息
"y"
的问题的答复)。mutt
您可能希望将邮件移动到单独的邮箱中:这会标记与给定搜索表达式匹配的所有邮件,将它们保存到邮箱
bad.mbox
,并在从原始邮箱中删除它们后退出。看看
procmail
、formail
和mimencode
。您可以使用这些轻松设置复杂的自动邮箱处理,例如(?:...)
是 Perl 正则表达式的一部分,而不是任何一个标准的 POSIX 正则表达式。ERE 等效项(forgrep -E
或sed -E
)应为:请参阅为什么我的正则表达式在 X 中有效但在 Y 中无效?
正则表达式还将匹配任何具有长度为四个字符的倍数的字母数字字符串(仅此而已)的任何行,因此类似
question
,congrats
或任何四个字母的脏话或仅在一行上的四个字母的问候语都会匹配。此外,它不允许任何一端有任何空格,如果您只是删除个别行,您最终可能会收到消息,之后剩下的内容就毫无意义了。无论如何,您可以将其设置为需要至少五组,每组四个字符。那应该不太可能匹配随机单词。