Разбить следующий скрипт bash?

349
Macspt

Мне нужна помощь в разборе следующего скрипта 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 '' |rev | cut -c 2-| rev` | grep -q `echo $line |awk ''` || echo $line; done | mailx -s "Applicants Without Notification For `date "+%d/%b/%Y"`" 'person1@email.com, person2@email.com, person3@email.com' 

Что я могу сказать до сих пор ...

  1. cat файл application.log
  2. catрезультаты трубы и grepДата / Время в форматеY:M:D
  3. Делая выше, grepДата / Время в формате D:M:Yиз mail.logфайла.
  4. Это то место, где я его перепутал, похоже, что потом - grepснова, - echo- результаты в переменной, а затем используются awkдля форматирования данных определенным образом.
  5. Затем он принимает эти отформатированные результаты и echo-es данные, хранящиеся в переменной, и отправляет их по электронной почте людям, которые должны быть уведомлены.

ВОПРОСЫ:

  • Есть ли более эффективный способ написания этого скрипта? Труба, кажется, используется слишком много.
  • Если скрипт возвращает ложные срабатывания, где наиболее вероятная причина проблемы?

Вот фрагмент файла 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: <_www@server.thecompany.com>, To: <person1@thecompany.com>, Size: 9571, Sender-Host: mail-sn1nam01lp0119.outbound.protection.outlook.com, SSL: yes, Subject: CIF: 100899-Video Production Specialist: Danny Couch, Msg-Id: <20171126120341.866E12750554@server.thecompany.com> [26/Nov/2017 06:03:46] Sent: Queue-ID: 5a1aada0-000006fa, Recipient: <person1@thecompany.com>, 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: <_www@server.thecompany.com>, To: <person1@thecompany.com>, Size: 9886, Sender-Host: mail-by2nam01lp0181.outbound.protection.outlook.com, SSL: yes, Subject: CIF: 100899-Video Production Specialist: Don Brown, Msg-Id: <20171126151424.6379027519D6@server.thecompany.com> [26/Nov/2017 09:14:28] Sent: Queue-ID: 5a1ada53-00000713, Recipient: <person1@thecompany.com>, Result: delivered, Status: 2.0.0, Remote-Host: 127.0.0.1, Msg-Id: <20171126151424.6379027519D6@server.thecompany.com> [26/Nov/2017 09:32:40] Recv: Queue-ID: 5a1ade98-00000719, Service: SMTP, From: <_www@server.thecompany.com>, To: <person2@thecopmany.com>, Size: 8807, Sender-Host: mail-bn3nam01lp0176.outbound.protection.outlook.com, SSL: yes, Subject: CIF: 100916-Creative Services Team Manager: David Stanford, Msg-Id: <20171126153239.26CF22751A2F@server.thecompany.com> [26/Nov/2017 09:32:42] Sent: Queue-ID: 5a1ade98-00000719, Recipient: <person2@thecompany.com>, Result: delivered, Status: 2.0.0, Remote-Host: 127.0.0.1, Msg-Id: <20171126153239.26CF22751A2F@server.thecompany.com> 

Вот итоговое электронное письмо, которое отправляется людям в конце сценария почтовой части:

Subject: Applicants Without Recruiter Notification For 26/Nov/2017 Message-ID: <20171127055500.7BAF0275617B@thecompany.com> Date: Sun, 26 Nov 2017 23:55:00 -0600 From: System Administrator <admin@server.thecompany.com> Return-Path: admin@server.thecompany.com  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файле нет записи для Дэвида Стэнфорда, уведомление будет отражать ТОЛЬКО, что почтовый сервер не получил письмо для Дэвида Стэнфорда. Это не скажет это ни Дэнни Коучу, ни Дону Брауну, потому что он найдет их имена в mail.logфайле. Вместо этого скрипт генерирует уведомление для всех приложений, независимо от того, имеет ли mail.logфайл соответствующую запись в applicants.logфайле.

0
Пожалуйста, проверьте, не изменило ли мое редактирование вашего кода в удобочитаемую форму; исправить при необходимости. Kamil Maciorowski 6 лет назад 1
Было бы очень полезно, если бы вы предоставили (фрагмент) `Applicants.log` и (фрагмент)` mail.log` вместе с результирующим текстом, который вводится в `mailx` (чтобы убедиться, что мы получаем тот же результат) , Попробуйте заставить их генерировать ложный положительный результат и скажите нам, где именно в конечном тексте это находится. Предположим, мы не знаем формат используемых вами журналов, поэтому трудно проанализировать, что с ними делают `awk` и другие инструменты; если вы не дадите нам фрагменты, то есть. [Изменить] Ваш вопрос, чтобы добавить эту информацию. Kamil Maciorowski 6 лет назад 0
КМ: Вот фрагменты, которые вы просили. Я посмотрю на ваши настройки и отправлю обратно. Macspt 6 лет назад 0
(1) Что не так с трубами? Правда, длинная строка едва читаема, но вы можете разделить ее [как я сделал] (https://superuser.com/revisions/1270941/3). (2) Я получил ложные срабатывания от ваших фрагментов, потому что мой `date '+% b" `возвращает неанглийское сокращенное имя. Какие у вас настройки языка? Пожалуйста, добавьте вывод `printenv | egrep "^ LANG | ^ LC_" `. Kamil Maciorowski 6 лет назад 0
1. Ничего плохого в трубах, я не эксперт, поэтому я подумал, что спросить, это лучший способ сделать это? 2. Я проверил сервер и LANG = en_US.UTF-8 Macspt 6 лет назад 0
Извините, я не могу воспроизвести эти ложные срабатывания. Когда я устанавливаю `LANG = en_US.UTF-8`, вывод из` done` будет пустым. Kamil Maciorowski 6 лет назад 0

1 ответ на вопрос

0
Macspt

Так что я обнаружил, что это не проблема со сценарием как таковым. Сценарий должен был запускаться каждую ночь с использованием cron под учетной записью root. Доступ к mail.logфайлу почтового сервера был настроен на использование закрытого ключа / ключа публикации. Ключ публикации не был правильно скопирован в учетную запись пользователя root на почтовом сервере. Таким образом, при запуске сценария у него не было необходимых разрешений для перехода к mail.logфайлу. Именно это привело к сбою сценария и созданию ложных срабатываний, поскольку он не мог прочитатьmail.log файл, чтобы извлечь из него данные.

При настройке доступа к секретному ключу / пабу с клиента на сервер убедитесь, что вы скопировали ключ паба в соответствующую учетную запись пользователя, который будет запускать сценарий. В этом случае ключ публикации был скопирован в учетную запись администратора на почтовом сервере, но не в ту учетную запись, на которой выполнялся сценарий с файлового сервера.

Так что, если BOB будет учетной записью, выполняющей скрипт, вы должны иметь:

  • /users/bob/.ssh/id_rsa (На клиентском компьютере)
  • /users/bob/.ssh/id_rsa.pub (На сервере ваш пытается получить доступ)

Это для Mac OSX BTW.