如何在 bash 中附加电子邮件内容的 MD5 校验和?

如何在 bash 中附加电子邮件内容的 MD5 校验和?

我发现通过 cron 发送的自动生成的电子邮件通知缺少一些输出行。确认不存在 AVC 错误后,我想通过附加电子邮件内容的 MD5 校验和来查明电子邮件的完整性在传输过程中是否受到损害。我有以下脚本将生成电子邮件:

{
  echo -e "\nUptime";
  uptime;

  last -x --since yesterday;
} | mail -s "Info" user

我知道我可以执行以下操作来单独获取 MD5 校验和:

{
  echo -e "\nUptime";
  uptime;

  last -x --since yesterday;
} | openssl md5

但是如何将校验和与电子邮件内容结合在一起呢?

答案1

如果您特别需要 MD5 校验和,可以将内容通过管道传送到文件并对其进行校验和,然后通过管道将文件和校验和(带有分隔符)传送到邮件。

使用MD5

如果您想使用 MD5 和,您可以将脚本编辑为以下内容,该脚本将写入临时文件,生成校验和,附加它,然后发送邮件。

#!/bin/sh

outfile=$(mktemp)
echo -e "\nUptime"                                    > $outfile 2>&1
uptime                                               >> $outfile  2>&1
last -x --since yesterday                            >> $outfile  2>&1

md5=$(md5sum $outfile | cut -f1 -d' ')
echo-e  "\n==============================\n${md5}\n" >> $outfile 2>&1
cat $outfile | mail -s "Info" user

rm $outfile  # don't forget this - clean up your /tmp!

这会将所有 STDERR 和 STDOUT 消息捕获到日志文件中,并将其通过电子邮件发送给您,并将 MD5 校验和添加到底部,这样您就可以将输出放回文件中并重新校验它以确保其匹配。

使用GPG

或者,您可以创建(或使用现有的)GPG 密钥,用于对来自服务器的消息进行签名。鉴于这将被设置为以自动方式签署消息,我强烈建议不要将此密钥用于任何您需要保持安全或需要高度信任的事情,因为如果您的计算机被破坏,此密钥将受到损害。

最简单的方法是在gpg --gen-key服务器(或其他任何东西)上生成 GPG 密钥。大多数细节并不重要,但重要的是密码。有了这个,您可以:

  • 设置空白密码(不建议- 永远不要创建无密码密钥)
  • 设置密码并保存到受限文件 ( chmod 400)
  • 设置密码并将其传递到 GPG 命令中

在此示例中,我将显示一个密钥,该密钥确实具有已添加到具有适当权限的文件中的密码。创建您的密钥并设置密码,如下所示:

~ » gpg --gen-key
# enter in details for key
    ...
    pub   2048R/B44FD582 2015-02-28 [expires: 2015-03-01]
          Key fingerprint = CFAD 2D53 BB7F CA22 147C  9300 E858 EE8A B44F D582
    uid                  mytestkey (This is my key) <[email protected]>
    sub   2048R/D3AEDE76 2015-02-28 [expires: 2015-03-01]

~ » echo -n 'mypassphrase' > ~/.ssh/gpgsignkey
~ » chmod 400 ~/.ssh/gpgsignkey
~ » gpg -a --export [email protected] > myserver.key.asc

到目前为止,您的服务器上将有一个可用于签名的密钥,密码短语位于安全位置的受限文件中(~/.ssh 保持得相当严格),并且您拥有可以myserver.key.asc导入的公钥在您的本地计算机上以验证收到的消息。

然后,您可以修改您的 cron 作业以运行一个执行您的命令的脚本,然后通过 gpg 传输输出,以在发送到邮件服务器的途中对消息进行签名。

#!/bin/sh

outfile=$(mktemp)
echo -e "\nUptime"                                    > $outfile 2>&1
uptime                                               >> $outfile  2>&1
last -x --since yesterday                            >> $outfile  2>&1

cat $outfile | gpg --clearsign -u [email protected] --passphrase-file /root/.ssh/gpgsignkey | mail -s "Info" user

rm $outfile

然后,您可以将公钥导入到您的电子邮件客户端(只要它支持)或其他密钥验证机制中,并验证您收到的消息确实是已发送的消息。

相关内容