Використання змінних – практичне застосування з журналами¶
Вступ¶
У другому уроці «Bash — використання змінних» ви побачили кілька способів використання змінних і дізналися багато нового про те, для чого можна використовувати змінні. Це лише один практичний приклад використання змінних у сценаріях bash.
Інформація¶
Коли системному адміністратору доводиться мати справу з файлами журналів, іноді в гру вступають різні формати. Скажімо, ви хочете отримати певну інформацію з dnf.log
(/var/log/dnf.log
). Давайте швидко поглянемо на те, як виглядає цей файл журналу за допомогою tail /var/log/dnf.log
:
2022-05-04T09:02:18-0400 DEBUG extras: using metadata from Thu 28 Apr 2022 04:25:35 PM EDT.
2022-05-04T09:02:18-0400 DEBUG repo: using cache for: powertools
2022-05-04T09:02:18-0400 DEBUG powertools: using metadata from Thu 28 Apr 2022 04:25:36 PM EDT.
2022-05-04T09:02:18-0400 DEBUG repo: using cache for: epel
2022-05-04T09:02:18-0400 DEBUG epel: using metadata from Tue 03 May 2022 11:55:16 AM EDT.
2022-05-04T09:02:18-0400 DEBUG repo: using cache for: epel-modular
2022-05-04T09:02:18-0400 DEBUG epel-modular: using metadata from Sun 17 Apr 2022 07:09:16 PM EDT.
2022-05-04T09:02:18-0400 INFO Last metadata expiration check: 3:07:06 ago on Wed 04 May 2022 05:55:12 AM EDT.
2022-05-04T09:02:18-0400 DDEBUG timer: sack setup: 512 ms
2022-05-04T09:02:18-0400 DDEBUG Cleaning up.
Тепер подивіться на файл журналу messages
tail /var/log/messages
:
May 4 08:47:19 localhost systemd[1]: Starting dnf makecache...
May 4 08:47:19 localhost dnf[108937]: Metadata cache refreshed recently.
May 4 08:47:19 localhost systemd[1]: dnf-makecache.service: Succeeded.
May 4 08:47:19 localhost systemd[1]: Started dnf makecache.
May 4 08:51:59 localhost NetworkManager[981]: <info> [1651668719.5310] dhcp4 (eno1): state changed extended -> extended, address=192.168.1.141
May 4 08:51:59 localhost dbus-daemon[843]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.10' (uid=0 pid=981 comm="/usr/sbin/NetworkManager --no-daemon " label="system_u:system_r:NetworkManager_t:s0")
May 4 08:51:59 localhost systemd[1]: Starting Network Manager Script Dispatcher Service...
May 4 08:51:59 localhost dbus-daemon[843]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
May 4 08:51:59 localhost systemd[1]: Started Network Manager Script Dispatcher Service.
May 4 08:52:09 localhost systemd[1]: NetworkManager-dispatcher.service: Succeeded.
І, нарешті, давайте подивимося на результат команди date
:
Wed May 4 09:47:00 EDT 2022
Висновки та цілі¶
Тут ми бачимо, що два файли журналу, dnf.log
і messages
, відображають дату абсолютно різними способами. Якби ми хотіли отримати інформацію з журналу messages
у сценарії bash за допомогою date
, ми могли б зробити це без особливих проблем, але отримати ту саму інформацію з dnf.log
потребує певних зусиль. Скажімо, як системному адміністратору вам потрібно щодня переглядати dnf.log
, щоб переконатися, що в систему не було внесено нічого, про що ви не знали або могло б спричинити проблеми. Ви хочете, щоб ця інформація отримувалася з файлу dnf.log
за датою та надсилалася вам електронною поштою щодня. Ви будете використовувати завдання cron
, щоб автоматизувати це, але спочатку нам потрібно отримати сценарій, який буде робити те, що ми хочемо.
Сценарій¶
Щоб виконати те, що ми хочемо, ми збираємося використати змінну в нашому сценарії під назвою «today», яка форматуватиме дату відповідно до дати, що відображається в dnf.log
. Щоб отримати правильний формат дати
, ми використовуємо +%F
, що дасть нам потрібний формат рррр-мм-дд. Оскільки нас цікавить тільки день, а не час чи будь-яка інша інформація, це все, що нам знадобиться, щоб отримати правильну інформацію з dnf.log
. Спробуйте лише таку частину сценарію:
#!/usr/bin/env bash
# script to grab dnf.log data and send it to administrator daily
today=`date +%F`
echo $today
Тут ми використовуємо команду echo
, щоб перевірити, чи вдалося нам форматувати дату. Коли ви запускаєте сценарій, ви маєте отримати результат із сьогоднішньою датою, яка виглядає приблизно так:
2022-05-04
Якщо так, то чудово, ми можемо видалити наш рядок «debug» і продовжити. Давайте додамо іншу змінну під назвою «logfile», яку ми встановимо як /var/log/dnf.log
, а потім подивимося, чи зможемо ми grep
це за допомогою нашої змінної «today». Наразі давайте просто запустимо стандартний вихід:
!/usr/bin/env bash
# script to grab dnf.log data and send it to administrator daily
today=`date +%F`
logfile=/var/log/dnf.log
/bin/grep $today $logfile
У dnf.log
щодня міститься багато інформації, тому ми не виводимо її на екран, але ви маєте побачити вихідні дані, які містять лише поточні дані. Спробуйте сценарій, і якщо він спрацює, ми зможемо перейти до наступного кроку. Після того, як ми перевірили вихідні дані, наступним кроком є те, що ми хочемо виконати перенаправлення каналу, щоб надіслати інформацію електронною поштою.
Підказка
Щоб виконати наступний крок, вам потрібно встановити mailx
і поштову службу, наприклад postfix
. Існує також певна конфігурація, яка ймовірно знадобиться для отримання електронної пошти з вашого сервера на електронну адресу вашої компанії. Не турбуйтеся про ці кроки на даний момент, оскільки ви можете перевірити maillog
, щоб побачити, чи була зроблена спроба, а потім працювати звідти, щоб отримати електронну пошту з вашого сервера на вашу електронну адресу. Цей документ не стосується цього. Наразі зробіть:
dnf install mailx postfix
systemctl enable --now postfix
#!/usr/bin/env bash
# script to grab dnf.log data and send it to administrator daily
today=`date +%F`
logfile=/var/log/dnf.log
/bin/grep $today $logfile | /bin/mail -s "DNF logfile data for $today" systemadministrator@domain.ext
Давайте подивимося на доповнення до сценарію тут. Ми додали pipe |
для перенаправлення виводу на /bin/mail
, встановили тему електронного листа (-s
) із тим, що в подвійні лапки та встановіть одержувачем "systemadministrator@domain.ext". Замініть цей останній біт своєю адресою електронної пошти, а потім спробуйте знову запустити сценарій.
Як зазначалося, ви, ймовірно, не отримаєте електронний лист без деяких змін у налаштуваннях пошти Postfix, але ви повинні побачити спробу в /var/log/maillog
.
Наступні кроки¶
Наступне, що вам потрібно зробити, це налаштувати надсилання електронної пошти з вашого сервера. Ви можете переглянути Postfix для звітування, щоб почати роботу з цього. Нам також потрібно автоматизувати цей сценарій для щоденного виконання, для цього ми використаємо cron
. Тут є кілька посилань: cron, anacron, та cronie. Щоб дізнатися більше про форматування дати, перегляньте man date
або це посилання.
Author: Steven Spencer
Contributors: Antoine Le Morvan, Ganna Zhyrnova