Вопрос или проблема
пытаюсь обновить файл mailserver.cfg с текущим временем unix, чтобы он правильно синхронизировался со вторым резервным сервером.
строка, которую я хочу изменить, выглядит так:
<variable name="UpdateLastCheck">1606252085</variable>
число 1606252085
я создал небольшой скрипт, который устанавливает корректное unix время в файл, чтобы оно было таким же в файле mailserver.cfg.
Когда я хочу сделать резервную копию файла, он читает время из time.cfg и должен быть таким же в файле mailserver.cfg, после резервного копирования новое время должно быть записано в файл mailserver.cfg.
скрипт, который у меня есть на данный момент
#!/bin/bash
echo "Создано мной, обновление времени"
timestamp=$(date +%s)
timestold=$(cat /home/timestamp.cfg)
echo "Старое время = $timestold"
sed -i -e '/UpdateLastCheck/s/$timestold/$timestamp/' mailserver.cfg && $timestamp > timestamp.cfg
echo "Новое время = $timestamp"
Есть ли предложения, как изменить unix-время в этой строке?
Ответ или решение
Для решения вашей задачи по обновлению временной метки Unix во файлe mailserver.cfg
на Ubuntu 20.04 с использованием Kerio Connect Mailserver, необходимо внести исправления в использованный вами скрипт. Давайте разберем текущие ошибки и предложим оптимальное решение.
Теория:
Ваш текущий скрипт нацелен на замену временной метки Unix во файлe mailserver.cfg
. Это делается с помощью команды sed
, которая требуется для поиска и замены старой временной метки на новую. Однако в текущей версии скрипта отсутствуют ключевые моменты, которые могут привести к его некорректной работе. Основной проблемой является использование переменных $timestold
и $timestamp
в команде sed
, которые не обрабатываются в корректной форме.
Пример:
Для выполнения замены с помощью sed
, необходимо применить замену с использованием слэш-символов (/
), а также регулярных выражений, которые требуют правильного экранирования символов. В вашем сценарии нужно учесть, что переменные Bash не интерполируются внутри одинарных кавычек. Поэтому использование одинарных кавычек в выражении sed приводит к тому, что заменяются именно слова $timestold
и $timestamp
, а не их значимые значения.
Применение:
Для более эффективного и правильного выполнения замены, ваш скрипт должен выглядеть следующим образом:
#!/bin/bash
echo "Created by Me, timeupdate"
# Получаем текущий Unix-временной штамп
timestamp=$(date +%s)
# Читаем старый временной штамп из файла
timestold=$(cat /home/timestamp.cfg)
echo "Old time = $timestold"
# Используем sed для замены старого Unix-времени на новое во всем файле
sed -i -e "s/<variable name=\"UpdateLastCheck\">$timestold<\/variable>/<variable name=\"UpdateLastCheck\">$timestamp<\/variable>/g" mailserver.cfg
# Записываем новое время в timestamp.cfg
echo $timestamp > /home/timestamp.cfg
echo "New Time = $timestamp"
Объяснение улучшений:
-
Правильное экранирование: Мы экранировали символы
<
и>
в выражении заменыsed
, чтобы корректно обновить XML-синтаксис вmailserver.cfg
. -
Интерполяция переменных: Убедитесь, что выражение
sed
заключено в двойные кавычки, чтобы ядро оболочки Bash могло интерполировать значения переменных$timestold
и$timestamp
. -
Использование правильного пути: Убедитесь, что ваш скрипт имеет правильные пути к файлам
mailserver.cfg
иtimestamp.cfg
. В приведенном скрипте предполагается, что первый файл находится в текущем рабочем каталоге скрипта, аtimestamp.cfg
– в указанном/home
. -
Обработка ошибок: Хотя вышеуказанный скрипт является основным решением, всегда желательно включать дополнительные проверки на случай ошибок. Например, проверьте, существует ли файл
timestamp.cfg
перед его чтением, и убедитесь, чтоmailserver.cfg
не только существует, но и доступен для записи. -
Предварительное резервное копирование: Прежде чем изменять файлы конфигурации, убедитесь, что ваши данные в безопасности. Создайте резервные копии важных файлов, чтобы избежать возможной потери данных при неверной записи.
Простое следование этим шагам должно привести к успешной и безопасной замене временной метки в вашей конфигурации сервера. Поддержание времени в соответствии с резервным сервером является необходимым шагом для обеспечения стабильности и надежности системы.