📜 Как парсить файлы конфигурации INI с помощью باش – تیم امنیت اطلاعات

Разбор INI-файла конфигурации с использованием بش پوسته-کریپتا.

Образец INI-файла

Я буду использовать следующий файл конфигурации INI в следующих كارااخ. [19659
زمان بندی = 10
monitor_interval = 20

[database]
سرور = db.example.org
بندر = 3306
نام کاربری = dbuser
رمز عبور = dbpass

[monitor]
سرورها [] = www.example.org
سرورها [] = proxy.example.org
سرورها [] = cache.example.org
سرورها [] = bastion.example.org

Спарсить весь INI-файл

Прочитаем и проанализируем весь INI-файл.

 #! / bin / bash
# پرونده ساده INI را بخوانید و تجزیه کنید

# دریافت بخش INI
ReadINISections ()
  نام محلی محلی = "$ 1"
  awk '{if ($ 1 ~ / ^  [/) section=tolower(gensub(/[(.+)] / ، "\ 1" ، 1 ، 1 $))؛ پیکربندی [section] = 1} End {برای (کلید در پیکربندی) key کلید چاپ}} '$ {نام پرونده
}

# دریافت / تنظیم تمام بخش های INI
GetINISections ()
  نام محلی محلی = "$ 1"

  بخش ها = "$ (خواندن $ نام پرونده)"
  برای بخش در $ $؛ انجام دادن
    array_name = "پیکربندی _ $ {بخش}"
    اعلام کنید -g -A $ {array_name
  انجام شده
  eval $ (awk -F = '
                    if ($ 1 ~ / ^  [/) 
                      section=tolower(gensub(/[(.+)] / ، "\ 1" ، 1 ، 1 $))
                    دیگری اگر (1 دلار! ~ / ^ $ / && $ 1!! / ^؛ /)
                      gsub (/ ^ [ t] + | [ t] + $ /، ""، 1 $)؛
                      gsub (/ [[]] /، ""، $ 1)؛
                      gsub (/ ^ [ t] + | [ t] + $ /، ""، 2 دلار)؛
                      if (پیکربندی [section][$1]  == "")
                        پیکربندی [section][$1] = 2 دلار
                      دیگر
                        پیکربندی [section][$1] = پیکربندی [section][$1] "" 2 $}
                    }
                    پایان {
                      برای (بخش در پیکربندی)
                        برای (کلید در پیکربندی [section])
                          بخش "configuration_" را چاپ کنید "[""key""] = " "پیکربندی [section][key]"  "؛"
                    } '$ {نام پرونده
        )


}

اگر [ "$#" -eq "1" ] && [ -f "$1" ]؛ سپس
  filename = "$ 1"
  GetINISections "$ filename"

  echo -n "شرح پیکربندی:"
  اگر [ -n "${configuration_main["description"]} "]؛
    echo "$ {configuration_main ["description"]}"
  دیگر
    پژواک "گمشده"
  فی
  پژواک

  برای بخش در $ (ReadINISections "configuration.ini")؛ انجام دادن
    پژواک "[${section}]"
    برای کلید به $ (پیکربندی پیوند تنظیم $ $} [@] }) انجام دادن
            echo -e "key {key $ = $ (eval echo $  {پیکربندی _ $ {بخش} [$key]  ()" (دسترسی به آن با استفاده از $ (تنظیمات echo $  {پیکربندی _ $ {بخش} [$key] })) "
    انجام شده
  انجام شده
دیگر
  تکرار "پرونده INI گم شده"

Вывод ќе выглядеть چنین.

 $ parseini configuration.ini
توضیحات پیکربندی: پیکربندی نمونه

[database]
  نام کاربری = dbuser (دسترسی به آن با استفاده از $ {configuration_database [username]})
  سرور = db.example.org (با استفاده از $ {configuration_database [server] it به آن دسترسی پیدا کنید)
  رمز عبور = dbpass (با استفاده از $ {configuration_database [password] it به آن دسترسی داشته باشید)
  پورت = 3306 (با استفاده از $ {configuration_database [port] it به آن دسترسی داشته باشید)
[main]
  توضیحات = پیکربندی نمونه (با استفاده از $ {configuration_main Разбор INI-файла конфигурации с использованием Bash shell-скрипта. Образец INI-файла Я буду использовать следующий файл конфигурации INI в следующих примерах. [main] description = Sample configuration timeout = 10 monitoring_interval = 20 [database] server = db.example.org port = 3306 username = dbuser password =... access) به آن دسترسی داشته باشید
  timeout = 10 (با استفاده از $ {configuration_main [timeout] it به آن دسترسی داشته باشید)
  monitor_interval = 20 (با استفاده از $ {configuration_main [monitoring_interval] it به آن دسترسی داشته باشید)
[monitor]
  servers = www.example.org proxy.example.org cache.example.org bastion.example.org (به آن دسترسی پیدا کنید با استفاده از $ {configuration_monitor [servers]}) 

Парсинг مجدداً در INI-файل

 #! / bin / bash
# بخش خوانده شده و تجزیه شده در پرونده INI


# دریافت / تنظیم بخش INI
GetINISection ()
  نام محلی محلی = "$ 1"
  بخش محلی = "2 دلار"

  array_name = "پیکربندی _ $ {بخش}"
  اعلام کنید -g -A $ {array_name
  eval $ (awk -v configuration_array = "$ {array_name}" ارزیابی کنید
             -v اعضا = "بخش $" 
             -F = '
                    if ($ 1 ~ / ^  [/) 
                      section=tolower(gensub(/[(.+)] / ، "\ 1" ، 1 ، 1 $))
                    دیگری اگر (1 دلار! ~ / ^ $ / && $ 1!! / ^؛ /)
                      gsub (/ ^ [ t] + | [ t] + $ /، ""، 1 $)؛
                      gsub (/ [[]] /، ""، $ 1)؛
                      gsub (/ ^ [ t] + | [ t] + $ /، ""، 2 دلار)؛
                      if (بخش == عضو) {
                        if (پیکربندی [section][$1]  == "")
                          پیکربندی [section][$1] = 2 دلار
                        دیگر
                          پیکربندی [section][$1] = پیکربندی [section][$1] "" 2 $}
                      }
                    }
                    پایان {
                        برای (کلید در پیکربندی [members])
                          چاپ configuration_array "[""key""] = " "پیکربندی [members][key]"  "؛"
                    } '$ {نام پرونده
        )
}

if [ "$#" -eq "2" ] && [ -f "$1" ] && [ -n "$2" ]؛ سپس
  filename = "$ 1"
  بخش = "2 دلار"
  GetINISection "$ filename" "$ $"

  پژواک "[${section}]"
  برای کلید به $ (پیکربندی پیوند تنظیم $ $} [@] }) انجام دادن
          echo -e "key {key $ = $ (eval echo $  {پیکربندی _ $ {بخش} [$key]  ()" (دسترسی به آن با استفاده از $ (تنظیمات echo $  {پیکربندی _ $ {بخش} [$key] })) "
  انجام شده
دیگر
  echo "پرونده INI یا بخش INI از دست رفته"

ووود می تواند به این ترتیب باشد.

 $ parseinisection configuration.ini اصلی
[main]
  توضیحات = پیکربندی نمونه (با استفاده از $ {configuration_main Разбор INI-файла конфигурации с использованием Bash shell-скрипта. Образец INI-файла Я буду использовать следующий файл конфигурации INI в следующих примерах. [main] description = Sample configuration timeout = 10 monitoring_interval = 20 [database] server = db.example.org port = 3306 username = dbuser password =... access) به آن دسترسی داشته باشید
  timeout = 10 (با استفاده از $ {configuration_main [timeout] it به آن دسترسی داشته باشید)
  monitor_interval = 20 (دسترسی به آن با استفاده از $ {configuration_main [monitoring_interval] access)