我需要帮助来分解以下 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]'
到目前为止我能说的是......
cat
文件application.log
- 管道
cat
结果和grep
日期/时间格式Y:M:D
- 执行上述操作时,
grep
日期/时间采用文件D:M:Y
中的格式。mail.log
- 这就是我将其混合的地方,它看起来像是再次
grep
-s,echo
将结果放在一个变量中,然后awk
以特定的方式用来格式化数据。 - 然后,它获取这些格式化的结果和
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.log
David 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 的。