Архив метки: Скрипты

📜 Bash скрипт для копирования всех файлов с той же структурой каталогов

Этот скрипт оболочки предназначен для конкретной задачи, необходимой для нашего сервера.

Задача

Наша задача – скопировать все файлы, созданные в каталоге, в другой каталог с такой же структурой каталогов.

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

🐧 Скрипт shell для резервного копирования базы данных MongoDB

MongoDB – это кроссплатформенный, ориентированный на документы сервер баз данных NoSql.

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

Скрипт также удаляет резервные копии с сервера старше указанного дня.

Вы можете скопировать этот скрипт:

!/bin/bash





######################################################################



##



##   MongoDB Database Backup Script 



##   Written By: Rahul Kumar



##   Update on: June 20, 2020



##



######################################################################



export PATH=/bin:/usr/bin:/usr/local/bin



TODAY=`date +"%d%b%Y"`





######################################################################



######################################################################



DB_BACKUP_PATH='/backup/mongo'



MONGO_HOST='localhost'



MONGO_PORT='27017'





# If mongodb is protected with username password.



# Set AUTH_ENABLED to 1 



# and add MONGO_USER and MONGO_PASSWD values correctly



AUTH_ENABLED=0



MONGO_USER=''



MONGO_PASSWD=''



# Set DATABASE_NAMES to "ALL" to backup all databases.



# or specify databases names seprated with space to backup 



# specific databases only.



DATABASE_NAMES='ALL'



#DATABASE_NAMES='mydb db2 newdb'



## Number of days to keep local backup copy



BACKUP_RETAIN_DAYS=30   



######################################################################



######################################################################



mkdir -p ${DB_BACKUP_PATH}/${TODAY}



AUTH_PARAM=""



if [ ${AUTH_ENABLED} -eq 1 ]; then



AUTH_PARAM=" --username ${MONGO_USER} --password ${MONGO_PASSWD} "



fi



if [ ${DATABASE_NAMES} = "ALL" ]; then



echo "You have choose to backup all databases"



mongodump --host ${MONGO_HOST} --port ${MONGO_PORT} ${AUTH_PARAM} --out ${DB_BACKUP_PATH}/${TODAY}/



else



echo "Running backup for selected databases"



for DB_NAME in ${DATABASE_NAMES}



do



mongodump --host ${MONGO_HOST} --port ${MONGO_PORT} --db ${DB_NAME} ${AUTH_PARAM} --out ${DB_BACKUP_PATH}/${TODAY}/



done



fi



######## Remove backups older than {BACKUP_RETAIN_DAYS} days  ########



DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`





if [ ! -z ${DB_BACKUP_PATH} ]; then



      cd ${DB_BACKUP_PATH}



      if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then



            rm -rf ${DBDELDATE}



      fi



fi





######################### End of script ##############################

Расписание резервного копирования MongoDB

Вы можете легко запланировать этот скрипт в crontab для регулярного резервного копирования баз данных.

0 2 * * * /backup/mongo-backup.sh



2020-06-23T08:44:52
Скрипты

📜 Как парсить файлы конфигурации INI с помощью Bash

Разбор INI-файла конфигурации с использованием Bash shell-скрипта.

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

Я буду использовать следующий файл конфигурации INI в следующих примерах.

[main]

description = Sample configuration

timeout = 10

monitoring_interval = 20



[database]

server = db.example.org

port = 3306

username = dbuser

password = dbpass



[monitor]

servers[] = www.example.org

servers[] = proxy.example.org

servers[] = cache.example.org

servers[] = bastion.example.org

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

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

#!/bin/bash

# Read and parse simple INI file 



# Get INI section

ReadINISections(){

  local filename="$1"

  awk '{ if ($1 ~ /^[/) section=tolower(gensub(/[(.+)]/,"\1",1,$1)); configuration[section]=1 } END {for (key in configuration) { print key} }' ${filename}

}



# Get/Set all INI sections

GetINISections(){

  local filename="$1"



  sections="$(ReadINISections $filename)"

  for section in $sections; do

    array_name="configuration_${section}"

    declare -g -A ${array_name}

  done

  eval $(awk -F= '{ 

                    if ($1 ~ /^[/) 

                      section=tolower(gensub(/[(.+)]/,"\1",1,$1)) 

                    else if ($1 !~ /^$/ && $1 !~ /^;/) {

                      gsub(/^[ t]+|[ t]+$/, "", $1); 

                      gsub(/[[]]/, "", $1);

                      gsub(/^[ t]+|[ t]+$/, "", $2); 

                      if (configuration[section][$1] == "")  

                        configuration[section][$1]=$2

                      else

                        configuration[section][$1]=configuration[section][$1]" "$2} 

                    } 

                    END {

                      for (section in configuration)    

                        for (key in configuration[section])  

                          print "configuration_"section"[""key""]=""configuration[section][key]"";"

                    }' ${filename}

        )





}



if [ "$#" -eq "1" ] && [ -f "$1" ]; then

  filename="$1"

  GetINISections "$filename"



  echo -n "Configuration description: "

  if [ -n "${configuration_main["description"]}" ]; then

    echo "${configuration_main["description"]}"

  else

    echo "missing"

  fi

  echo



  for section in $(ReadINISections "configuration.ini"); do

    echo "[${section}]"

    for key in $(eval echo ${'!'configuration_${section}[@]}); do

            echo -e "  ${key} = $(eval echo ${configuration_${section}[$key]}) (access it using $(echo ${configuration_${section}[$key]}))"

    done

  done

else

  echo "missing INI file"

fi

Вывод будет выглядеть так.

$ parseini configuration.ini 

Configuration description: Sample configuration



[database]

  username = dbuser (access it using ${configuration_database[username]})

  server = db.example.org (access it using ${configuration_database[server]})

  password = dbpass (access it using ${configuration_database[password]})

  port = 3306 (access it using ${configuration_database[port]})

[main]

  description = Sample configuration (access it using ${configuration_main[description]})

  timeout = 10 (access it using ${configuration_main[timeout]})

  monitoring_interval = 20 (access it using ${configuration_main[monitoring_interval]})

[monitor]

  servers = www.example.org proxy.example.org cache.example.org bastion.example.org (access it using ${configuration_monitor[servers]})

Парсинг одного раздела в INI-файле

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

#!/bin/bash

# Read and parse single section in INI file 





# Get/Set single INI section

GetINISection() {

  local filename="$1"

  local section="$2"



  array_name="configuration_${section}"

  declare -g -A ${array_name}

  eval $(awk -v configuration_array="${array_name}" 

             -v members="$section" 

             -F= '{ 

                    if ($1 ~ /^[/) 

                      section=tolower(gensub(/[(.+)]/,"\1",1,$1)) 

                    else if ($1 !~ /^$/ && $1 !~ /^;/) {

                      gsub(/^[ t]+|[ t]+$/, "", $1); 

                      gsub(/[[]]/, "", $1);

                      gsub(/^[ t]+|[ t]+$/, "", $2);

                      if (section == members) {

                        if (configuration[section][$1] == "")  

                          configuration[section][$1]=$2

                        else

                          configuration[section][$1]=configuration[section][$1]" "$2}

                      }

                    } 

                    END {

                        for (key in configuration[members])  

                          print configuration_array"[""key""]=""configuration[members][key]"";"

                    }' ${filename}

        )

}



if [ "$#" -eq "2" ] && [ -f "$1" ] && [ -n "$2" ]; then

  filename="$1"

  section="$2"

  GetINISection "$filename" "$section"



  echo "[${section}]"

  for key in $(eval echo ${'!'configuration_${section}[@]}); do

          echo -e "  ${key} = $(eval echo ${configuration_${section}[$key]}) (access it using $(echo ${configuration_${section}[$key]}))"

  done

else

  echo "missing INI file and/or INI section"

fi

Вывод будет выглядеть так.

$ parseinisection configuration.ini main

[main]

  description = Sample configuration (access it using ${configuration_main[description]})

  timeout = 10 (access it using ${configuration_main[timeout]})

  monitoring_interval = 20 (access it using ${configuration_main[monitoring_interval]})

Спонсор данной статьи – https://ocomp.info/kak-sdelat-video-otkryitku.html



2020-02-02T13:41:47
Скрипты

📜 Как сохранить конфигурацию в 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 дополнительные функции, чтобы отделить эти части от основного скрипта оболочки.



2020-01-10T15:19:03
Скрипты

🐧 Bash скрипт для проверки успешных и неудачных попыток входа пользователя в Linux

Одна из типичных задач администраторов Linux – проверка успешных и неудачных попыток входа в систему Linux.

Это гарантирует, что не будет никаких незаконных покушений на окружающую среду.

Их очень трудно проверить вручную, потому что вывод файла «/var/log/secure» выглядит нечитабельно.

Чтобы сделать это проще и эффективнее, нам нужно написать скрипт на bash.

Я включил в этот учебник два скрипта.

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

Кроме того, они показывают успешные попытки входа в систему, а также неудачные.

Первый скрипт позволяет вам проверять информацию о доступе пользователя по любой дате, доступной в файле «/var/log/secure».

Способ 1: скрипт  для проверки успешных и неудачных попыток входа пользователя в Linux

Этот скрипт позволяет вам проверить информацию о доступе пользователя по заданной дате из терминала.

# vi /opt/scripts/user-access-details.sh



#!/bin/bash

echo ""

echo -e "Enter the Date, Use Double Space for date from 1 to 9 (Nov  3) and use Single Space for date from 10 to 31 (Nov 30): c"

read yday

MYPATH=/var/log/secure*

tuser=$(grep "$yday" $MYPATH | grep "Accepted|Failed" | wc -l)

suser=$(grep "$yday" $MYPATH | grep "Accepted password|Accepted publickey|keyboard-interactive" | wc -l)

fuser=$(grep "$yday" $MYPATH | grep "Failed password" | wc -l)

scount=$(grep "$yday" $MYPATH | grep "Accepted" | awk '{print $9;}' | sort | uniq -c)

fcount=$(grep "$yday" $MYPATH | grep "Failed" | awk '{print $9;}' | sort | uniq -c)

echo "--------------------------------------------"

echo "       User Access Report on: $yday"

echo "--------------------------------------------"

echo "Number of Users logged on System: $tuser"

echo "Successful logins attempt: $suser"

echo "Failed logins attempt: $fuser"

echo "--------------------------------------------"

echo -e "Success User Details:n $scount"

echo "--------------------------------------------"

echo -e "Failed User Details:n $fcount"

echo "--------------------------------------------"

Установите права на исполнение файла «user-access-details-1.sh».

# chmod +x /opt/scripts/user-access-details-1.sh

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

# sh /opt/scripts/user-access-details.sh



Enter the Date, Use Double Space for date from 1 to 9 (Nov  3) and use Single Space for date from 10 to 31 (Nov 30): Nov  6

------------------------------------------

        User Access Report on: Nov  6

------------------------------------------

Number of Users logged on System: 1

Successful logins attempt: 1

Failed logins attempt: 0

------------------------------------------

Success User Details:

       1 root

------------------------------------------

Failed User Details:

------------------------------------------

еще пример:

# sh /opt/scripts/user-access-details.sh



Enter the Date, Use Double Space for date from 1 to 9 (Nov  3) and use Single Space for date from 10 to 31 (Nov 30): Nov 30

------------------------------------------

        User Access Report on: Nov 30

------------------------------------------

Number of Users logged on System: 20

Successful logins attempt: 14

Failed logins attempt: 6

------------------------------------------

Success User Details:

       1 daygeek

      1 root

      3 u1

      4 u2

      1 u3

      2 u4

      2 u5

------------------------------------------

Failed User Details:

       3 u1

      3 u4

------------------------------------------

Метод 2: Скрипт для проверки успешных и неудачных попыток входа пользователя в систему с помощью электронной почты.

Этот скрипт на Bash позволяет вам ежедневно отправлять почту с информацией о доступе пользователя по электронной почте на вчерашнюю дату.

# vi /opt/scripts/user-access-details-2.sh



#!/bin/bash

/tmp/u-access.txt

SUBJECT="User Access Reports on "date""

MESSAGE="/tmp/u-access.txt"

TO="admin@itsecforu.ru"

MYPATH=/var/log/secure*

yday=$(date --date='yesterday' | awk '{print $2,$3}')

tuser=$(grep "$yday" $MYPATH | grep "Accepted|Failed" | wc -l)

suser=$(grep "$yday" $MYPATH | grep "Accepted password|Accepted publickey|keyboard-interactive" | wc -l)

fuser=$(grep "$yday" $MYPATH | grep "Failed password" | wc -l)

scount=$(grep "$yday" $MYPATH | grep "Accepted" | awk '{print $9;}' | sort | uniq -c)

fcount=$(grep "$yday" $MYPATH | grep "Failed" | awk '{print $9;}' | sort | uniq -c)

echo "--------------------------------------------" >> $MESSAGE

echo "       User Access Report on: $yday" >> $MESSAGE

echo "--------------------------------------------" >> $MESSAGE

echo "Number of Users logged on System: $tuser" >> $MESSAGE

echo "Successful logins attempt: $suser" >> $MESSAGE

echo "Failed logins attempt: $fuser" >> $MESSAGE

echo "--------------------------------------------" >> $MESSAGE

echo -e "Success User Details:n $scount" >> $MESSAGE

echo "--------------------------------------------" >> $MESSAGE

echo -e "Failed User Details:n $fcount" >> $MESSAGE

echo "--------------------------------------------" >> $MESSAGE

mail -s "$SUBJECT" "$TO" < $MESSAGE

Установите права на исполнение файла «user-access-details-2.sh».

# chmod +x /opt/scripts/user-access-details-2.sh

Наконец добавьте cronjob, чтобы автоматизировать это действие.

Он будет срабатывать каждый день в 8 часов.

# crontab -e



0 8 * * * /bin/bash /opt/scripts/user-access-details-2.sh

Примечание. Вы будете получать оповещения по электронной почте каждый день в 8 часов, что относится к информации о доступе пользователей за предыдущий день.



2019-12-04T16:10:51
Скрипты

👤 Bash скрипт для отправки почты о создании новой учетной записи пользователя

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

Также вам может понадобиться отправить эти детали по почте.

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

Мы можем сделать это другим способом, как мы уже описали в предыдущей статье.

🍨 Bash скрипт для отправки почты, когда в системе создается новая учетная запись пользователя

Для Linux доступно множество инструментов мониторинга с открытым исходным кодом.

Но я не думаю, что у них есть способ отследить процесс создания нового пользователя и предупредить администратора, когда это произойдет.

Итак, как мы можем этого достичь?

Мы можем написать наш собственный скрипт Bash для достижения этой цели.

Мы  уже добавили много полезных скриптов оболочки в прошлом.

Если вы хотите посмотреть их, перейдите по ссылке ниже.

Скрипты для Linux , автоматизация и безопасность

Что на самом деле делает этот скрипт?

Он будет делать резервную копию файла «/etc/passwd» два раза в день (начало дня и конец дня), что позволит вам получить новые данные о создании пользователя на указанную дату.

# crontab -e



1 0 * * * cp /etc/passwd /opt/scripts/passwd-start-$(date +"%Y-%m-%d")

59 23 * * * cp /etc/passwd /opt/scripts/passwd-end-$(date +"%Y-%m-%d")

Он использует команду «difference» для обнаружения различий между файлами, и, если обнаружится какая-либо разница со вчерашней датой, скрипт отправит оповещение по электронной почте на электронный адрес с указанием новых данных пользователя.

Мы не можем часто запускать этот скрипт, потому что создание пользователей происходит не часто.

Однако мы планируем запускать этот скрипт один раз в день.

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

Примечание. Мы использовали наш электронный идентификатор в скрипте лишь для демонстрации.

Поэтому мы просим вас использовать вместо этого свой электронный адрес.

# vi /opt/scripts/new-user-detail.sh



#!/bin/bash

mv /opt/scripts/passwd-start-$(date --date='yesterday' '+%Y-%m-%d') /opt/scripts/passwd-start

mv /opt/scripts/passwd-end-$(date --date='yesterday' '+%Y-%m-%d') /opt/scripts/passwd-end

ucount=$(diff /opt/scripts/passwd-start /opt/scripts/passwd-end | grep ">" | cut -d":" -f6 | cut -d"/" -f3 | wc -l)

if [ $ucount -gt 0 ]

then

SUBJECT="ATTENTION: New User Account is created on server : `date --date='yesterday' '+%b %e'`"

MESSAGE="/tmp/new-user-logs.txt"

TO="itsecforu@mydickbigger.com"

echo  "Hostname: `hostname`" >> $MESSAGE

echo -e "n" >> $MESSAGE

echo "The New User Details are below." >> $MESSAGE

echo "+------------------------------+" >> $MESSAGE

diff /opt/scripts/passwd-start /opt/scripts/passwd-end | grep ">" | cut -d":" -f6 | cut -d"/" -f3 >>  $MESSAGE

echo "+------------------------------+" >> $MESSAGE

mail -s "$SUBJECT" "$TO" < $MESSAGE

rm $MESSAGE

fi

Установите исполняемое разрешение на файл «new-user-detail.sh».

$ chmod +x /opt/scripts/new-user-detail.sh

Наконец добавьте cronjob, чтобы автоматизировать этот процесс.

Ежедневно в 7 утра.

# crontab -e



0 7 * * * /bin/bash /opt/scripts/new-user.sh

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

Вывод: вывод будет таким же, как и приведенный ниже.

# cat /tmp/new-user-logs.txt



Hostname: testLinux.itsecoforu.ru



The New User Details are below.

+------------------------------+

tsarev

+------------------------------+

  • Добавить в Словарь

    • Новый список слов для Русский -> Русский…
    • Создать новый список слов…

  • Копировать