📜 Как сохранить конфигурацию в shell скрипте — Information Security Squad
📜 Как сохранить конфигурацию в shell скрипте
Сохраните конфигурацию во время выполнения скрипта оболочки, используя простой, но эффективный метод.

Shell скрипт

Я буду использовать следующий скрипт оболочки, чтобы проиллюстрировать идею.

Ничего особенного, он отобразит доступное дисковое пространство на конкретном сервере и разделе.

#!/usr/bin/env bash
# Display available disk space on specific server and partition

# default parameters
default_bastion=""
default_busername=""
default_server="localhost"
default_username="milosz"
default_partition="/srv"

# nextcloud server
nextcloud_server="nextcloud.local"
nextcloud_partition="/data"

# dokuwiki server
dokuwiki_bastion="bastion.example.org"
dokuwiki_busername="bouncer"
dokuwiki_server="192.0.2.10"
dokuwiki_username="dokuwiki"
dokuwiki_partition="/wiki"

# kolab server
kolab_bastion="bastion.example.org"
kolab_busername="bouncer"
kolab_server="192.0.2.20"
kolab_username="monitoring"
kolab_partition="/"

# get defined servers/applications
applications="$((set -o posix; set) | awk -F '='  '/_server/ {split($1,array,"_"); print array[1]}' | grep -v default)"

# get defined attributes
attributes="$((set -o posix; set) | awk -F '=' '/default_/ {split($1,array,"_"); print array[2]}')"

for application in $applications; do
  # define attributes for server/application
  for attribute in $attributes; do
    application_attribute="${application}_${attribute}"
    default_attribute="default_${attribute}"
    if [ -n "${!application_attribute}" ]; then
      eval "${attribute}"="${!application_attribute}"
    else
      eval "${attribute}"="${!default_attribute}"
    fi
  done

  # perform an action
  if [ -n "$bastion" ]; then
    bastion_param="-J ${busername}@${bastion}"
  else
    bastion_param=""
  fi
	echo -n "$server: "
  ssh $bastion_param $server -l $username "bash -c 'df -h --output=avail $partition | sed 1d'"
done

Использование

Выполните вышеупомянутый скрипт оболочки, чтобы увидеть доступное дисковое пространство на указанных серверах.

nextcloud.local:   87G
192.0.2.10:   98G
192.0.2.20:  5,5G

Как это работает

Атрибуты

Определите значения по умолчанию, не забудьте включить пустые.

# default parameters
default_bastion=""
default_busername=""
default_server="localhost"
default_username="milosz"
default_partition="/srv"
Эти переменные будут использоваться для извлечения имен атрибутов.
# get defined attributes
attributes="$((set -o posix; set) | awk -F '=' '/default_/ {split($1,array,"_"); print array[2]}')"

Извлеченные имена атрибутов.

attributes="bastion busername server username partition"

Приложения

Определите атрибуты для каждого приложения.

# nextcloud server
nextcloud_server="nextcloud.local"
nextcloud_partition="/data"
[...]

Эти переменные будут использоваться для извлечения имен приложений.

Обратите внимание, я использую атрибут server в качестве индикатора приложения в этом примере.
# get defined servers/applications
applications="$((set -o posix; set) | awk -F '='  '/_server/ {split($1,array,"_"); print array[1]}' | grep -v default)"

Названия извлеченных приложений.

applications="nextcloud dokuwiki kolab"

Разбор атрибутов для каждого приложения

Я буду перебирать список приложений.

for application in $applications; do

Присвойте атрибуты (например, server, username …), используя переменную application_attribute (значения, такие как nextcloud_server, nextcloud_username, … в зависимости от имени приложения), чтобы определить имя целевой переменной и значение для чтения, используя конструкцию $ {! Application_attribute}. Используйте значение по умолчанию, если оно пустое.

  # define attributes for server/application
  for attribute in $attributes; do
    application_attribute="${application}_${attribute}"
    default_attribute="default_${attribute}"
    if [ -n "${!application_attribute}" ]; then
      eval "${attribute}"="${!application_attribute}"
    else
      eval "${attribute}"="${!default_attribute}"
    fi
  done

Выполните нужные действия, используя короткие имена атрибутов.

  # perform an action
  if [ -n "$bastion" ]; then
    bastion_param="-J ${busername}@${bastion}"
  else
    bastion_param=""
  fi
	echo -n "$server: "
  ssh $bastion_param $server -l $username "bash -c 'df -h --output=avail $partition | sed 1d'"

Конец цикла приложения не требует пояснений.

done

Дополнительные замечания

Используйте source дополнительные функции, чтобы отделить эти части от основного скрипта оболочки.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

5e7fa976b0640d40