Задать вопрос
@alvenysh

Как добавить/обновить блок в файле bash скриптом?

Добрый день, есть файл /etc/logrotate.d/syslog-ng (речь про astra linux)
там может быть (а может и не быть) блок типа
/var/log/syslog
{
   rotate 10
   missingok
                    endscript
}

помимо этого блока есть и другие. Не могу понять как с помощью баш-скрипта можно найти этот блок и если он есть - заменить своими значениями (при этом моих значений может быть больше, чем стандартных). Если этого блока нет - добавить его.
Думал про такую функцию
function check_file_content_2() {
    local file_path=$1
    local expected_content=$2
    # Проверка наличия строки в файле
    if ! grep -qF "$expected_content" "$file_path"; then
        echo "$expected_content" >> "$file_path"
    fi
}

но она не срабатывает, да и по идее она так будет искать полное вхождение блока с моими значениями и если нет, то добавлять (но она даже так не добавляет)
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Средний 8 комментариев
Пригласить эксперта
Ответы на вопрос 1
3vi1_0n3
@3vi1_0n3
Если вам надо писать на баше, то надо делать ровно то, что надо, и не более. Баш достаточно буквальный язык.

Первая часть:
#!/bin/bash

# Создаем шаблон конфига из скрипта (без использования массива)
cat > ./syslog-template <<"EOF"
/var/log/syslog
{
  rotate 10
  size 10M
  daily
  missingok
  copytruncate
  notifempty
  compress
  delaycompress
  sharedscripts
  postrotate
    invoke-rc.d syslog-ng reload > /dev/null
  endscript
}
EOF

# Удаляем секцию из файла
sudo sed -i '/\/var\/log\/syslog/,/}/d' /etc/logrotate.d/syslog-ng
# Добавляем секцию в файл
# Тут, возможно, надо будет " | sudo tee -a" вместо пайпа
cat ./syslog-template >> /etc/logrotate.d/syslog-ng
# ^-- Вот эту команду можно совместить с первой, чтобы не создавать лишний файл


Вторая часть (не уверен, зачем она вообще нужна (так как изменения, внесенные первой частью, идемпотентны), но, раз вопрос так стоит, то пусть будет):
#!/bin/bash

# На момент вызова файл шаблона должен существовать
ORIGINAL=$(cat ./syslog-template) 
EXISTING=$(sed -rne '/\/var\/log\/syslog/,/}/p' /etc/logrotate.d/syslog-ng)
[[ "$ORIGINAL" == "$EXISTING" ]] && echo "файл настроен" || echo "файл не настроен"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы