deus_networkus/Modules/commands.sh
2026-03-11 13:39:04 +03:00

474 lines
No EOL
26 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
cat << EOF
+-------------------------------------------------------------------------------+
| Модуль |
| для массовой рассылки списка команд |
+-------------------------------------------------------------------------------+
EOF
while : #Запускается основной цикл
do
echo "Добро пожаловать в модуль для управления оборудованием"
echo "========================="
echo "Введите имя пользователя:"
read user_
path_to_script=$1
path_to_results= #Введите путь до папки, где хранится вывод данных
#Скрыть ввод пароля
stty_orig=$(stty -g)
stty -echo
read -p "Введите пароль: " pass_
#Возврат нормального ввода
stty "$stty_orig"
#Функция для создания бэкапов
function lets_go_backup {
#Адреса из массива передаются в переменную
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
echo -e "\033[0;32mПодключение к $ip_\033[0m"
sshpass -p "$pass_" ssh -o StrictHostKeyChecking=no $user_@$ip_ "sh run" > "$path_to_results/Данные со скрипта/Backups/$ip_.config.txt"
echo -e "\033[0;32mОтключение от $ip_\033[0m"
#Поиск названия оборудования
name_=$(cat " $path_to_results/Данные со скрипта/Backups/$ip_.config.txt" | grep "hostname")
name_words=($name_)
#Переименование выходного файла
mv "$path_to_results/Данные со скрипта/Backups/$ip_.config.txt" "$path_to_results/Данные со скрипта/Backups/${name_words[1]}.txt"
done
}
#Функция для сохранения конфигурации Cisco, Eltex, Natex
function lets_go_save_cisco_eltex_natex {
echo -e "\033[0;32mПодключение к $ip_\033[0m"
sshpass -p "$pass_" ssh -o StrictHostKeyChecking=no $user_@$ip_ "write memory"
echo -e "\033[0;32mОтключение от $ip_\033[0m"
}
#Функция для сохранения конфигурации Arlan
function lets_go_save_arlan {
echo -e "\033[0;32mПодключение к $ip_\033[0m"
sshpass -p "$pass_" ssh -o StrictHostKeyChecking=no $user_@$ip_ "copy running-config startup-config"
echo -e "\033[0;32mОтключение от $ip_\033[0m"
}
#Функция для передачи команд на коммутаторы
function lets_go_command {
#Команды из списка команд передаются по SSH
echo -e "\033[0;32mПодключение к $ip_\033[0m"
sshpass -p "$pass_" ssh -o StrictHostKeyChecking=no $user_@$ip_ < "$1/Deus_networkus/instructions_.txt"
echo -e "\033[0;32mОтключение от $ip_\033[0m"
}
#Создаём список для IP-адресов
ips_=()
#Создаём переменные для ведоров
cisco_list=()
eltex_list=()
natex_list=()
arlan_list=()
#Значение переменной считывается и выбирается соответствующее ему действие
echo " "
echo "Выберите действие, которое хотите сделать."
echo "1. Сделать бэкап коммутатора на свой ПК."
echo "2. Сохранить конфигурацию коммутатора."
echo "3. Передать команды на коммутатор."
read command_
#Цикл для выбора объектов для бэкапа
if [ $command_ == "1" ]; then
echo "IP-адреса из своего списка или из готовых?"
echo "1. Свой"
echo "2. Готовый"
read list_
if [ $list_ == "1" ]; then
echo "Список уже готов или Вы хотите создать его прямо сейчас?"
echo "1. Готов"
echo "2. Сделаю сейчас"
read ready_
if [ $ready_ == "1" ]; then
#Передача списка адресов в переменную
ip_="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_"
lets_go_backup
fi
if [ $ready_ == "2" ]; then
#Создаём переменную, в которую сохраним путь к файлу с IP-адресами
output_file="$1/Deus_networkus/ip_.txt"
#Очистим файл
> "$output_file"
echo "Введите IP-адреса. Для завершения используйте Ctrl+D"
#Считываем данные и передаём их в файл
while read -p "IP адрес: " ip_address; do
echo "$ip_address" >> "$output_file"
done
echo "Ввод завершён. IP-адреса сохранены."
#Передача списка адресов в переменную
ip_="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_"
lets_go_backup
fi
fi
if [ $list_ == "2" ]; then
echo " "
echo "Какое оборудование Вам нужно? "
echo "============================="
#Считываются папки, в которых содержатся папки с площадками и выводятся списком, обозначая сегменты оборудования.
list_segments_="$(ls "$1/Deus_networkus/Lists_of_switches/")"
#Сортируем список в порядке возрастания
sort_list_segments_=$(echo -e "$list_segments_" | sort -n)
#Выводится список сегментов, отсортированный по числам
echo "$sort_list_segments_"
#Выбирается сегмент
read segment_
#Запускается скрипт для вывода списка оборудования из папок
source "$path_to_script/Deus_networkus/Modules/choose_your_equipments.sh"
#Получаем строки из файла и находим IP-адреса
ips_+=$(grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" "$list_switches_")
#Передаём адреса в файл и в массив. Потом это нужно упростить и сделать напрямую, без файла.
echo "$ips_" > "$1/Deus_networkus/ip_.txt"
mapfile -t ips_ < "$1/Deus_networkus/ip_.txt"
lets_go_backup
fi
fi
if [ $command_ == "2" ]; then
echo "IP-адреса из своего списка или из готовых?"
echo "1. Свой"
echo "2. Готовый"
read list_
if [ $list_ == "1" ]; then
#Запрос вендора
echo "Выберите вендора:"
echo "1. Cisco, Eltex, Natex"
echo "2. Arlan"
read vendor_
echo "Список уже готов или Вы хотите создать его прямо сейчас?"
echo "1. Готов"
echo "2. Сделаю сейчас"
read ready_
if [ $ready_ == "1" ]; then
#Передача списка адресов в переменную
ip_list="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_list"
#Адреса из массива передаются в переменную и согласно вендора запускается необходимая функция
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
if [ $vendor_ == "1" ]; then
lets_go_save_cisco_eltex_natex
sleep 1
elif [ $vendor_ == "2" ]; then
lets_go_save_arlan
sleep 1
fi
done
fi
if [ $ready_ == "2" ]; then
#Создаём переменную, в которую сохраним путь к файлу с IP-адресами
output_file="$1/Deus_networkus/ip_.txt"
#Очистим файл
> "$output_file"
echo "Введите IP-адреса. Для завершения используйте Ctrl+D"
#Считываем данные и передаём их в файл
while read -p "IP адрес: " ip_address; do
echo "$ip_address" >> "$output_file"
done
echo "Ввод завершён. IP-адреса сохранены."
#Передача списка адресов в переменную
ip_list="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_list"
#Адреса из массива передаются в переменную и согласно вендора запускается необходимая функция
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
if [ $vendor_ == "1" ]; then
lets_go_save_cisco_eltex_natex
sleep 1
elif [ $vendor_ == "2" ]; then
lets_go_save_arlan
sleep 1
fi
done
fi
fi
if [ $list_ == "2" ]; then
echo " "
echo "Какое оборудование Вам нужно? "
echo "============================="
#Считываются папки, в которых содержатся папки с площадками и выводятся списком, обозначая сегменты оборудования.
list_segments_="$(ls "$1/Deus_networkus/Lists_of_switches/")"
#Сортируем список в порядке возрастания
sort_list_segments_=$(echo -e "$list_segments_" | sort -n)
#Выводится список сегментов, отсортированный по числам
echo "$sort_list_segments_"
#Выбирается сегмент
read segment_
#Запускается скрипт для вывода списка оборудования из папок
source "$path_to_script/Deus_networkus/Modules/choose_your_equipments.sh"
#Содержимое файла передаётся в переменную
switches_=$(cat "$list_switches_")
#Строки проверяются на наличие названий вендоров и распределяются в соотвествующие списки. Потом эти списки проверяются на наличие IP-адресов и они сохраняются в отдельные переменные.
cisco_list=$(echo "$switches_" | grep "Cisco")
cisco_ips=$(echo "$cisco_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
eltex_list=$(echo "$switches_" | grep "Элтекс")
eltex_ips=$(echo "$eltex_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
natex_list=$(echo "$switches_" | grep "Натекс")
natex_ips=$(echo "$natex_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
arlan_list=$(echo "$switches_" | grep "Арлан")
arlan_ips=$(echo "$arlan_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
#Если переменные не пустые, то выполняется команда к каждому IP-адресу из списка.
if [ "$cisco_ips" != "" ]; then
echo "$cisco_ips" | while IFS= read -r line; do
ip_=$line
lets_go_save_cisco_eltex_natex
sleep 1
done
fi
if [ "$eltex_ips" != "" ]; then
echo "$eltex_ips" | while IFS= read -r line; do
ip_=$line
lets_go_save_cisco_eltex_natex
sleep 1
done
fi
if [ "$natex_ips" != "" ]; then
echo "$natex_ips" | while IFS= read -r line; do
ip_=$line
lets_go_save_cisco_eltex_natex
sleep 1
done
fi
if [ "$arlan_ips" != "" ]; then
echo "$arlan_ips" | while IFS= read -r line; do
ip_=$line
lets_go_save_arlan
sleep 1
done
fi
fi
fi
if [ $command_ == "3" ]; then
echo "IP-адреса из своего списка или из готовых?"
echo "1. Свой"
echo "2. Готовый"
read list_
if [ $list_ == "1" ]; then
echo "Список уже готов или Вы хотите создать его прямо сейчас?"
echo "1. Готов"
echo "2. Сделаю сейчас"
read ready_
if [ $ready_ == "1" ]; then
echo "Команды уже записаны в файл или записать сейчас?"
echo "1. Уже записаны"
echo "2. Записать сейчас"
read commands_ready
if [ $commands_ready == "1" ]; then
#Передача списка адресов в переменную
ip_list="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_list"
#Адреса из массива передаются в переменную
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
lets_go_command
sleep 1
done
fi
if [ $commands_ready == "2" ]; then
#Создаём переменную, в которую сохраним путь к файлу с IP-адресами
output_commands_file="$1/Deus_networkus/instructions_.txt"
#Очистим файл
> "$output_commands_file"
echo "Введите команды. Для завершения используйте Ctrl+D"
#Считываем данные и передаём их в файл
while read -p "Команда: " command_to_file; do
echo "$command_to_file" >> "$output_commands_file"
done
echo "Ввод завершён. Команды сохранены."
#Передача списка адресов в переменную
ip_list="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_list"
#Адреса из массива передаются в переменную
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
lets_go_command
sleep 1
done
fi
fi
if [ $ready_ == "2" ]; then
#Создаём переменную, в которую сохраним путь к файлу с IP-адресами
output_file="$1/Deus_networkus/ip_.txt"
#Очистим файл
> "$output_file"
echo "Введите IP-адреса. Для завершения используйте Ctrl+D"
#Считываем данные и передаём их в файл
while read -p "IP адрес: " ip_address; do
echo "$ip_address" >> "$output_file"
done
echo "Ввод завершён. IP-адреса сохранены."
echo "Команды уже записаны в файл или записать сейчас?"
echo "1. Уже записаны"
echo "2. Записать сейчас"
read commands_ready
if [ $commands_ready == "1" ]; then
#Передача списка адресов в переменную
ip_list="$output_file"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_list"
#Адреса из массива передаются в переменную
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
lets_go_command
sleep 1
done
fi
if [ $commands_ready == "2" ]; then
#Создаём переменную, в которую сохраним путь к файлу с IP-адресами
output_commands_file="$1/Deus_networkus/instructions_.txt"
#Очистим файл
> "$output_commands_file"
echo "Введите команды. Для завершения используйте Ctrl+D"
#Считываем данные и передаём их в файл
while read -p "Команда: " command_to_file; do
echo "$command_to_file" >> "$output_commands_file"
done
echo "Ввод завершён. Команды сохранены."
#Передача списка адресов в переменную
ip_list="$1/Deus_networkus/ip_.txt"
#Передача списка адресов в массив
mapfile -t ips_ < "$ip_list"
#Адреса из массива передаются в переменную
for ip_ in "${ips_[@]}"; do
#Проверка на правильность написания IP-адреса
if [[ -z "$ip_" || "$ip_" == \#* ]]; then
continue
fi
lets_go_command
sleep 1
done
fi
fi
fi
if [ $list_ == "2" ]; then
echo " "
echo "Какое оборудование Вам нужно? "
echo "============================="
#Считываются папки, в которых содержатся папки с площадками и выводятся списком, обозначая сегменты оборудования.
list_segments_="$(ls "$1/Deus_networkus/Lists_of_switches/")"
#Сортируем список в порядке возрастания
sort_list_segments_=$(echo -e "$list_segments_" | sort -n)
#Выводится список сегментов, отсортированный по числам
echo "$sort_list_segments_"
#Выбирается сегмент
read segment_
#Запускается скрипт для вывода списка оборудования из папок
source "$path_to_script/Deus_networkus/Modules/choose_your_equipments.sh"
#Содержимое файла передаётся в переменную
switches_=$(cat "$list_switches_")
#Строки проверяются на наличие названий вендоров и распределяются в соотвествующие списки. Потом эти списки проверяются на наличие IP-адресов и они сохраняются в отдельные переменные.
cisco_list=$(echo "$switches_" | grep "Cisco")
cisco_ips=$(echo "$cisco_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
eltex_list=$(echo "$switches_" | grep "Элтекс")
eltex_ips=$(echo "$eltex_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
natex_list=$(echo "$switches_" | grep "Натекс")
natex_ips=$(echo "$natex_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
arlan_list=$(echo "$switches_" | grep "Арлан")
arlan_ips=$(echo "$arlan_list" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
echo "Команды уже записаны в файл или записать сейчас?"
echo "1. Уже записаны"
echo "2. Записать сейчас"
read commands_ready
if [ $commands_ready == "1" ]; then
#Если переменные не пустые, то выполняется команда к каждому IP-адресу из списка.
if [ "$cisco_ips" != "" ]; then
echo "$cisco_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
if [ "$eltex_ips" != "" ]; then
echo "$eltex_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
if [ "$natex_ips" != "" ]; then
echo "$natex_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
if [ "$arlan_ips" != "" ]; then
echo "$arlan_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
fi
if [ $commands_ready == "2" ]; then
#Создаём переменную, в которую сохраним путь к файлу с IP-адресами
output_commands_file="$1/Deus_networkus/instructions_.txt"
#Очистим файл
> "$output_commands_file"
echo "Введите команды. Для завершения используйте Ctrl+D"
#Считываем данные и передаём их в файл
while read -p "Команда: " command_to_file; do
echo "$command_to_file" >> "$output_commands_file"
done
echo "Ввод завершён. Команды сохранены."
#Если переменные не пустые, то выполняется команда к каждому IP-адресу из списка.
if [ "$cisco_ips" != "" ]; then
echo "$cisco_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
if [ "$eltex_ips" != "" ]; then
echo "$eltex_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
if [ "$natex_ips" != "" ]; then
echo "$natex_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
if [ "$arlan_ips" != "" ]; then
echo "$arlan_ips" | while IFS= read -r line; do
ip_=$line
lets_go_command $1
sleep 1
done
fi
fi
fi
fi
echo -e "\033[32mЗадание выполнено!\033[0m"
echo " "
done