
我正在尝试将大约 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 文本。
答案1
邮件用户代理mutt
(MUA) 可以按 MIME 类型从邮箱中删除邮件。您甚至可以编写此脚本。
具有编码附件的邮件可以mutt
与搜索表达式相匹配~M application
。这与包含字符串 的 MIME 类型的任何消息匹配application
,通常指示附件已编码(可能采用 base64)。application/x-msdownload
如果您愿意,您显然可以使用更具体的内容。
如果邮箱被调用,您可以删除其中包含包含命令行messages.mbox
字符串的附件的所有邮件,如下所示:application
mutt -e 'push <delete-pattern>"~M application"<enter><quit>"y"' -f messages.mbox
请注意,从邮箱中删除邮件之前不会要求任何确认(最后是对退出前是否删除邮件的"y"
问题的答复)。mutt
您可能希望将邮件移至单独的邮箱中:
mutt -e 'push <tag-pattern>"~M application"<enter><tag-prefix><save-message>bad.mbox<enter>"y"<quit>"y"' -f messages.mbox
这会标记与给定搜索表达式匹配的所有邮件,将它们保存到 邮箱bad.mbox
,并在从原始邮箱中删除它们后退出。
答案2
看看procmail
、formail
、 和mimencode
。您可以使用这些轻松设置复杂的自动邮箱处理,例如
查找并替换 mbox 文件中包含“Content-Type: application/x-msdownload”的所有邮件。
答案3
(?:...)
是 Perl 正则表达式的一部分,而不是标准 POSIX 正则表达式的一部分。 ERE 等效项(对于grep -E
或sed -E
)应该是:
^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
正则表达式还将匹配任何具有以下内容的行:任何长度为四个字符的倍数的字母数字字符串(没有其他字符),因此类似question
,congrats
或一行中单独的任何四个字母的脏话或四个字母的问候语都会匹配。此外,它不允许在两端有任何空格,如果您只删除单独的行,您可能会得到消息,其中后面剩下的内容毫无意义。
不管怎样,你可以做这样的事情,至少需要五组,每组四个字符。这应该不太可能匹配随机单词。
^([A-Za-z0-9+/]{4}){5,}([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$