分解以下 bash 脚本?

分解以下 bash 脚本?

我需要帮助来分解以下 bash 脚本,以了解作者试图做什么。该脚本旨在搜索日志文件中的数据,然后将其与电子邮件日志文件进行比较。然后将两个文件之间的差异通过电子邮件发送给“人员”。该脚本最近一直返回误报。

cat /Shared\ Items/CIF_FILES/logs/applicants/applicants.log |
grep `date "+%Y:%m:%d"` |
while read line; do grep "`date "+%d/%b/%Y"`" /usr/local/kerio/mailserver/store/logs/mail.log |
grep `echo $line |awk '{print $5}' |rev | cut -c 2-| rev` |
grep -q `echo $line |awk '{print $8}'` || echo $line; done |
mailx -s "Applicants Without Notification For `date "+%d/%b/%Y"`" '[email protected], [email protected], [email protected]'

到目前为止我能说的是......

  1. cat文件application.log
  2. 管道cat结果和grep日期/时间格式Y:M:D
  3. 执行上述操作时,grep日期/时间采用文件D:M:Y中的格式。mail.log
  4. 这就是我将其混合的地方,它看起来像是再次grep-s,echo将结果放在一个变量中,然后awk以特定的方式用来格式化数据。
  5. 然后,它获取这些格式化的结果和echo存储在变量中的数据,并通过电子邮件发送给需要通知的人员。

问题:

  • 有没有更有效的方法来编写此脚本?管道似乎使用得太多了。
  • 如果脚本返回误报,问题最可能的原因是什么?

以下是applicants.log文件的片段:

2017:11:26 - 06:03 - Couch, Danny / 100899-Video Production Specialist
2017:11:26 - 09:14 - Brown, Don / 100899-Video Production Specialist
2017:11:26 - 09:32 - Stanford, David / 100916-Creative Services Team Manager

以下是 mail.log 文件的片段:

[26/Nov/2017 06:03:44] Recv: Queue-ID: 5a1aada0-000006fa, Service: SMTP, From: <[email protected]>, To: <[email protected]>, Size: 9571, Sender-Host: mail-sn1nam01lp0119.outbound.protection.outlook.com, SSL: yes, Subject: CIF: 100899-Video Production Specialist: Danny Couch, Msg-Id: <[email protected]>
[26/Nov/2017 06:03:46] Sent: Queue-ID: 5a1aada0-000006fa, Recipient: <[email protected]>, Result: delivered, Status: 2.0.0 , Remote-Host: 127.0.0.1, Msg-Id: 
[26/Nov/2017 09:14:27] Recv: Queue-ID: 5a1ada53-00000713, Service: SMTP, From: <[email protected]>, To: <[email protected]>, Size: 9886, Sender-Host: mail-by2nam01lp0181.outbound.protection.outlook.com, SSL: yes, Subject: CIF: 100899-Video Production Specialist: Don Brown, Msg-Id: <[email protected]>
[26/Nov/2017 09:14:28] Sent: Queue-ID: 5a1ada53-00000713, Recipient: <[email protected]>, Result: delivered, Status: 2.0.0 , Remote-Host: 127.0.0.1, Msg-Id: <[email protected]>
[26/Nov/2017 09:32:40] Recv: Queue-ID: 5a1ade98-00000719, Service: SMTP, From: <[email protected]>, To: <[email protected]>, Size: 8807, Sender-Host: mail-bn3nam01lp0176.outbound.protection.outlook.com, SSL: yes, Subject: CIF: 100916-Creative Services Team Manager: David Stanford, Msg-Id: <[email protected]>
[26/Nov/2017 09:32:42] Sent: Queue-ID: 5a1ade98-00000719, Recipient: <[email protected]>, Result: delivered, Status: 2.0.0 , Remote-Host: 127.0.0.1, Msg-Id: <[email protected]>

以下是发送给脚本邮件部分末尾的人员的结果电子邮件:

Subject: Applicants Without Recruiter Notification For 26/Nov/2017
Message-ID: <[email protected]>
Date: Sun, 26 Nov 2017 23:55:00 -0600
From: System Administrator <[email protected]>
Return-Path: [email protected]

2017:11:26 - 06:03 - Couch, Danny / 100899-Video Production Specialist
2017:11:26 - 09:14 - Brown, Don / 100899-Video Production Specialist
2017:11:26 - 09:32 - Stanford, David / 100916-Creative Services Team Manager

applicants.log因此,仅当文件中存在条目而文件中没有相应条目时,才会出现结果通知(无通知的应用程序)mail.log。因此,如果文件中没有mail.logDavid Stanford 的条目,则通知只会反映邮件服务器未收到 David Stanford 的电子邮件。对于 Danny Couch 或 Don Brown,它不会这样说,因为它会在文件中找到他们的名字mail.log。相反,脚本会为所有应用程序生成通知,无论文件是否mail.log有相应的条目applicants.log

答案1

所以我发现这不是脚本本身的问题。该脚本计划在 root 帐户下使用 cron 每晚运行。对邮件服务器mail.log文件的访问配置为使用私钥/公钥。公钥尚未正确复制到邮件服务器上的 root 用户帐户。因此,当脚本运行时,它没有适当的权限来导航到该mail.log文件。这就是导致脚本失败并产生误报的原因,因为它无法读取文件mail.log以从中获取数据。

当您设置从客户端到服务器的私钥/公钥访问时,请确保将公钥复制到将运行脚本的相应用户帐户。在这种情况下,公钥已被复制到邮件服务器上的管理员帐户,但不是运行文件服务器脚本的同一帐户。

因此,如果 BOB 是运行该脚本的账户,您应该:

  • /users/bob/.ssh/id_rsa(在客户端计算机上)
  • /users/bob/.ssh/id_rsa.pub(在您尝试访问的服务器上)

顺便说一下,这是适用于 Mac OSX 的。

相关内容