[Из песочницы] Скрипт для тех, кому лень разбираться в Linux

Сфер применения Linux может быть очень много. Особенно, когда арендовать VPS стало можно от $1 в месяц. Кроме стандартного использования под хостинг сайтов, его используют в качестве сервера для игр (CS: GO, Terraria, Minecraft), в качестве Proxy-сервера и VPN-сервера. Под майнинг криптовалют. Под резервное хранилище бэкапов. Под домашнюю торренто-качалку. А также для тестирования, разработки и просто различных экспериментов. Именно доступность VPS на базе Linux с огромным спектром возможного его применения привела к популяризации Linux. Но желающих использовать Linux значительно больше, чем людей, которые умеют его использовать. И часто именно слабые познания администрирования Linux останавливают людей от его использования. Ну или просто усложняют таким людям жизнь — им приходится часами ковыряться в мануалах, форумах и «статьях для новичков».

Да мне и самому надоело лазить по специализированным форумам, каждый раз, когда приходится сделать шаг влево или шаг вправо относительно того, что я уже научился делать. Именно поэтому, со временем, все типовые вещи я свёл в один скрипт с дружелюбным интерфейсом, который умеет делать всё сам. Начиналась всё с малого. Скрипт просто автоматизировал установку нужного мне софта. Но за полгода он превратился уже в весьма серьёзную утилиту весом 85 Кб, в которой более 2100 строк кода. Скрипт ранее нигде не выкладывался. Использовался только в личных целях мной и несколькими моими товарищами. Пришло время им поделиться с публикой. Уверен, многим людям он способен сэкономить кучу времени.

Чтобы понять, что он умеет, проще всего глянуть на заглавный скриншот:

7f4f0237b28f4f419822fc213c40bf1a.png

Далее подробнее опишу, что и как он делает.

Информация о системе


Этот раздел в дружелюбной форме выводит информацию об этом сервере. Что за железо, какая ОС, какой IP-адрес. Причём, IP адрес он сначала пытается определить по интерфейсу, но т.к. бывают VPS без выделенного IP-адреса (за NAT), далее скрипт лезет в интернет и с помощью сторонних сайтов смотрит с какого IP пришли запросы и показывает реальный внешний IP-адрес (на это тратится пара секунд). Выглядит это информационное окно так:
1db39d43daad463591344379357b4cb1.png

Работа с ОС


В этом разделе собрано несколько как мелких утилит, типа смены пароля root, установки часового пояса, обновление ОС, добавление репозитория, установка популярных приложений (типа midinght commander), так и несколько более серьезных, на которых остановлюсь подробнее:
  • Антивирус. Да, на Линуксе не бывает вирусов. Но бывают бэкдоры, которые через сайт открывают доступ ко всем вашим файлам злоумышленникам. Через эти же бэкдоры спамеры потом могут делать спам-рассылки используя ваш сервер. У меня в своё время за это забанили VPS. Поэтому, я предусмотрел установку антивируса. Разбираться в нём не нужно. Сам всё ставит, обновляет. Далее, не разбираясь в синтаксисе антивируса, через скрипт можно проверить весь диск или конкретную папку (например, где хостятся сайты).
  • Firewall. Не все умеют настраивать правила Firewall (iptables). А в некоторых арендуемых VPS он преднастроен и включен, причём так, что устанавливаемые вами сервисы не будут доступны. И вам придётся копаться в настройках и открывать порты. А неправильная и необдуманная настройка firewall может вообще привести к тому, что вы после этого в принципе не сможете подключиться по SSH к своему серверу и вам придется либо переустанавливать ОС, либо как-то лезть на сервер через web-терминал, но эта функция есть не у всех хостеров. В случае использования моего скрипта такие проблемы исключены, а настройка Firewall происходит через «Помощник», где нужно просто ответить на простые вопросы.
  • Планировщик задач (cron). Бывает, что нужно периодически выполнять какие-то типовые действия: проверка на вирусы, очистка логов, выкладывание бэкапов и т.д. Многие знают, что в Linux есть планировщик, который может выполнять задания по расписанию, но не всё умеют им пользоваться. Мой скрипт позволяет установить, включить, выключить планировщик и добавить в него задание, выбрав интервал запуска.

Установка панели управления хостингом


Очень часто Linux используется именно для хостинга, но руками настраивать там все сервисы типа: Apache, Nginx, PHP, MySQL, почтовый демон и так далее — совсем непросто для новичков. Большинство предпочитает установить какую-либо панель управления. Но даже её нужно сначала как-то установить. В своём скрипте я собрал пять бесплатных панелей управления сайтом (Vesta CP, Webuzo, CWP, ZPanel, Ajenti) и платную ISPmanager (которая является, пожалуй, самой распространенной панелью в России). Про каждую панель есть небольшое описание, системные требования. Выбираем нужную панель, скрипт сам её скачает с официального сайта (свежую версию) и установит.

Работа с VPN


В последнее время многие заводят себе VPN для того, чтобы получить преимущества пользователей других географических зон. Например, обход запретов РосКомНадзора, использование каких-то внутренних американских или европейских сервисов и так далее. Многие для этого покупают готовые VPN-сервисы. Но значительно дешевле купить себе VPS в нужной стране и поднять свой собственный VPN. Вот только не все умеют его настраивать. С помощью этого скрипта вам нужно просто отвечать на вопросы и всё. Весь нужный софт установится сам, в firewall пропишутся нужные правила. Вы сможете просматривать, добавлять и удалять пользователей, которым разрешен доступ. Причём скрипт проанализирует какая у вас ОС и сделает всё, учитывая особенности конкретно этой ОС.

Работа с Proxy


Некоторым привычнее использовать прокси вместо VPN. Ну и это зачастую дешевле, потому что Прокси, в отличии от VPN, можно использовать на серверах, у которых нет своего выделенного IP-адреса (которые находятся за NAT), а такие сервера стоят в несколько раз дешевле (их можно приобрести за $2 в год). Поднимать свой прокси-сервер на Линукс — тоже не самая простая задача для новичков. Но этот скрипт всё сделает за вас. Причём там очень много настроек. «Помощник» при установке спросит на каком порту нам нужен Прокси (или же предложит стандартный), спросит нужна ли авторизация по логину/паролю (или пускать всех, кто знает адрес и порт). Скрипт даже учтёт потребности тех пользователей, кто любит загонять сторонник трафик в Прокси (через программы типа Proxifier) и настроит конфиг нужным образом. Ну и, естественно, сам внесёт все нужные правила в Firewall (iptables). Настройка прокси ещё никогда не была такой простой. Руками в конфиг лазить вообще не нужно.

Работа с файлами и программами


В этом разделе можно установить нужную программу (пакет) или удалить. Причём самое полезное там — это именно правильное удаление. Дело в том, что при установке какой-либо программы очень часто к ней устанавливается несколько сопутствующих пакетов, необходимых для её работы. И зачастую, размер этих дополнительных пакетов превышает размер собственно той программы, которую вы устанавливали. Но вот при удалении вашей программы удалится только сама программа, а все пакеты, которые были нужны для её (и только её) работы — останутся и продолжат занимать место. В моём скрипте я предусмотрел полное удаление программы — со всем дополнительным софтом, который ставился вместе с ней. В скрипте просто указываем название программы, дальше скрипт всё сделает сам.

Очистка системы


В случае активного использования сервера под хостинг, часто копится огромное количества логов доступа к сайтам. Объём всего этого мусора иногда может достигать гигабайт. Не все знают где и как это удалять. В этом разделе можно почистить эти логи. Удаляются логи Apache и Nginx, как целиком, так и конкретного пользователя. Кроме этого, из этого раздела можно удалить старые установочные пакеты, которые по умолчанию остаются на диске после установки софта и продолжают занимать место.
На этом, собственно, пока всё. В планах, конечно, много что ещё хочется добавить. Например, бенчмарк, для оценки производительности различных компонентов сервера. Расширить поддержку других ОС и так далее. По мере сил и времени, я собственно этим и занимаюсь. Но, уже сейчас, он выполняет довольно много функций, востребованных новичками и способен сильно упростить им жизнь.

Теперь собственно, очень важный вопрос. А на каких дистрибутивах Linux всё это работает? На всех версиях CentOS. А также, на всех прочих производных от Red Hat Enterprise Linux дистрибутивах (например, Scientific Linux). Почему именно RHEL? Ну скрипт я писал для себя, а мне CentOS ближе. Ну и если говорить о целевой аудитории данного скрипта (новички), то им, как правило, без разницы на каком дистрибутиве работать. Ведь обычно они одинаково плохо знают любой из них. А RHEL весьма неплох, стабилен, нетребователен к ресурсам, ну и, самое главное, присутствует почти у каждого хостера VPS. Версию CentOS при этом можно выбрать любую (5, 6, 7), как и разрядность. Для всех действий скрипт анализирует какая версия дистрибутива и учитывает специфику именно этой версии. Я, обычно, выбираю дистрибутив CentOS 6.x (можно Minimal) с разрядностью 64 бита.

Ну и самое главное. Как собственно обзавестись этим скриптом? Ниже прилагаю полный листинг кода скрипта со всеми потрохами и подробными комментариями (для тех, кто хочет что-то своё дописать):

Исходный код скрипта
#!/bin/bash
ver="v1.8.1"
title="Breeze Easy Shell"
title_full="$title $ver"
#-----------------
#типовые функции
#-----------------

#функция, которая запрашивает только один символ
myread()
{
temp=""
while [ -z "$temp" ] #защита от пустых значений
do
read -n 1 temp
done
eval $1=$temp
echo
}

#функция, которая запрашивает только да или нет. А ещё можно попробовать использовать как while [ -z ${!$1} ]
myread_yn()
{
temp=""
while [[ "$temp" != "y" && "$temp" != "Y" && "$temp" != "n" && "$temp" != "N" ]] #запрашиваем значение, пока не будет "y" или "n"
do
echo -n "y/n: "
read -n 1 temp
echo
done
eval $1=$temp
}

#функция, которая запрашивает только цифру
myread_dig()
{
temp=""
counter=0
while [[ "$temp" != "0" && "$temp" != "1" && "$temp" != "2" && "$temp" != "3" && "$temp" != "4" && "$temp" != "5" && "$temp" != "6" && "$temp" != "7" && "$temp" != "8" && "$temp" != "9" ]] #запрашиваем значение, пока не будет цифра
do
if [ $counter -ne 0 ]; then echo -n "Неправильный выбор. Ведите цифру: "; fi
let "counter=$counter+1"
read -n 1 temp
echo
done
eval $1=$temp
}

#функция установки с проверкой не установлен ли уже пакет
myinstall()
{
if [ -z `rpm -qa $1` ]; then
	yum -y install $1
else
	echo "Пакет $1 уже установлен"
	br
fi
}

title()
{
clear
echo "$title"
}

menu()
{
clear
echo "$menu"
echo "Выберите пункт меню:"
}

wait()
{
echo "Нажмите любую клавишу, чтобы продолжить..."
read -s -n 1
}

br()
{
echo ""
}

updatescript()
{
wget $updpath/$filename -r -N -nd
chmod 777 $filename
}

undone()
{
echo "Данная функция в стадии разработки или отключена." #функция ставится в нереализованные пункты№№№№№№№№№№ меню в качестве заглушки
}

settimezone()
{
/bin/cp /usr/share/zoneinfo/$1/$2  /etc/localtime
echo "Новый часовой пояс установлен. Текущее время: $(date +%H:%M)."
wait
}

repo4()
{
echo "Будут добавлены репозитории для CentOS 4 x64"
wait
echo "Устанавливаем репозитории..."
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el4.rf.x86_64.rpm
rpm -K rpmforge-release-0.5.3-1.el4.rf.x86_64.rpm
rpm -i rpmforge-release-0.5.3-1.el4.rf.x86_64.rpm
}

repo5()
{
echo "Будут добавлены репозитории EPEL, REMI, RPMForge и ELRepo для CentOS 5 x64"
wait
echo "Устанавливаем репозитории..."
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-5.rpm
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
rpm -K rpmforge-release-0.5.3-1.el5.rf.*.rpm
rpm -i rpmforge-release-0.5.3-1.el5.rf.*.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-5-5.el5.elrepo.noarch.rpm
br
echo "Репозитории были добавлены."
wait
}

repo6()
{
echo "Будут добавлены репозитории EPEL, REMI, RPMForge и ELRepo для CentOS 6 x64"
wait
echo "Устанавливаем репозитории..."
rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
br
echo "Репозитории были добавлены."
wait
}

repo7()
{
echo "Будут добавлены репозитории EPEL, REMI, RPMForge, ELRepo, atrpms для CentOS 7 x64"
wait
echo "Устанавливаем репозитории..."
rpm --import https://fedoraproject.org/static/0608B895.txt
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms
rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
rpm -ivh http://atrpms.net/ht/httptunnel-4.0.0-3_pre1.el7.centos.x86_64.rpm
br
echo "Репозитории были добавлены."
wait
}

iptables_save()
{
#проверка CentOS 7
if [ $osver1 -eq 7 ]; then 
	myinstall iptables-services | tee > null
fi
service iptables save
}

openport()
{
chain=$(echo $1 | tr [:lower:] [:upper:])
if [ "$chain" == "IN" ]; then chain="INPUT"; t1="dport"
else
	if [ "$chain" == "OUT" ]; then chain="OUTPUT";  t1="sport"
	else
		echo "неправильно указано направление правила для открытия порта"
	wait
	fi
fi
iptables -I $chain -p $2 --$t1 $3 -j ACCEPT #возможно в будущем предусмотрю выбор ключа -I или -A
iptables_save
}

webuzo_install()
{
openport in tcp 2004
openport in tcp 2002
wget http://files.webuzo.com/install.sh -r -N -nd
sh install.sh
rm -f install.sh
}

cwp_install()
{
openport in tcp 2030
openport in tcp 2031
wget http://centos-webpanel.com/cwp-latest
sh cwp-latest
rm -f cwp-latest
}

zpanel_install()
{
wget http://evtikhov.ru/zpanel.sh
sh zpanel.sh
rm -f zpanel.sh
}

ajenti_install()
{
openport in tcp 8000
rpm -i http://repo.ajenti.org/ajenti-repo-1.0-1.noarch.rpm 
echo "Устанавливаем Ajenti"
yum -y install ajenti
echo "Устанавливаем Ajenti V"
yum -y install ajenti-v ajenti-v-nginx ajenti-v-mysql ajenti-v-php-fpm php-mysql
echo "Отключаем SSL для админки"
sed -i -e 's/"enable": true/"enable": false/' /etc/ajenti/config.json
whatismyipext
echo "Выставляем наш внешний IP в конфиг"
sed -i -e "s/\"host\": \"0.0.0.0\"/\"host\": \"$ipext\"/" /etc/ajenti/config.json
echo "Устанавливаем русский язык по умолчанию"
sed -i -e 's/    "bind": {/    "language": "ru_RU",\n    "bind": {/' /etc/ajenti/config.json
echo "Перезапускаем Ajenti"
service ajenti restart
br
echo "Панель управления Ajenti и Ajenti V были установлены. Теперь можете управлять сервером из браузера."
echo "Адрес: http://$ipext:8000"
echo "Логин: root"
echo "Пароль: admin"
br
wait
}

mtu_change()
{
ifconfig $1 mtu $2
wait
}
#Функция проверки установленного приложения, exist возвращает true если установлена и false, если нет.
installed()
{
exist=`whereis $1 | awk {'print $2'}` #вариант быстрый, но не всегда эффективный
if [ -z $exist ]
	then #будем использовать оба варианта
	exist=`rpm -qa $1` #вариант медленнее, но эффективнее
fi

if [ -n "$exist" ]
then
exist=true
else
exist=false
fi
}

#функция которая открывает на редактирование файл в приоритете: mc, nano, vi
edit()
{
installed mc
if [ $exist == true ]; then mcedit  $1
  else
  installed nano
  if [ $exist == true ]; then nano  $1
    else
    vi $1
  fi
fi
}

#функция удаления.
uninstall()
{
if [ $osver1 -eq 5 ]; then yum erase $1 $2 $3 $4 $5;
else
myinstall yum-remove-with-leaves | tee > null
yum --remove-leaves remove $1 $2 $3 $4 $5
fi
}

#Определяем активный внешний интерфейс
whatismyiface()
{
if [ $osver1 -eq 7 ]; then
  installed ifconfig
  if [ $exist == false ]; then yum -y install net-tools | tee > null; fi
fi
if [ -n "$(ifconfig | grep eth0)" ]; then iface="eth0"
else
    if [ -n "$(ifconfig | grep venet0:0)" ]; then iface=venet0:0; fi
fi
}

#определяем ip на внешнем интерфейсе
whatismyip()
{
whatismyiface
case "$osver1" in
4|5|6)
ip=`ifconfig $iface | grep 'inet addr' | awk {'print $2'} | sed s/.*://`
;;
7)
installed ifconfig
if [ $exist == false ]; then yum -y install net-tools | tee > null; fi
ip=`ifconfig $iface | grep 'inet' | sed q | awk {'print $2'}`
;;
*)
echo "Версия ОС неизвестна. Выходим."
wait
;;
esac
}

#определяем внешний IP через запрос
whatismyipext()
{
installed wget
if [ $exist == false ]; then myinstall wget; fi
ipext=`wget --no-check-certificate -qO- https://2ip.ru/index.php | grep "Ваш IP адрес:" | sed s/.*button\"\>// | sed s_"<"_" "_ | awk {'print $1'}`
}

whatismyip_full()
{
whatismyip
echo "Ваш внешний IP: $ip?"
myread_yn ans
case "$ans" in
  y|Y)
  #ничего не делаем, выходим из case
  ;;
  n|N|т|Т)
  echo "Если был неправильно определен IP, вы можете произвести настройку в ручном режиме."
  echo "Для этого Вам нужно определить как называется Ваш сетевой интерфейс, через который Вы выходите в интернет."
  echo "Если хотите вывести на экран все сетевые интерфейсы, чтобы определить какой из них внешний - нажмите 1."
  myread ans
  if [ "$ans" == "1" ]; then ifconfig; br; wait; fi
  br
  echo "Укажите название интерфейса, который имеет внешний IP (обычно eth0, venet0 или venet0:0)"
  read int
  ip=`ifconfig $int | grep 'inet addr' | awk {'print $2'} | sed s/.*://`
  #centOS7
  if [ $osver1 -eq 7 ]; then ip=`ifconfig $int | grep 'inet' | sed q | awk {'print $2'}`; fi
  echo "Ваш внешний IP: $ip?"
  myread_yn ans
  case "$ans" in
    y|Y)
    ;;
    n|N|т|Т)
    echo "Тогда введите IP вручную:"
    read ip
    ;;
    *)
    echo "Неправильный ответ. Выходим."
    wait
    sh $0
    exit 0
    ;;
  esac
  ;;
  *)
  echo "Неправильный ответ. Выходим."
  wait
  sh $0
  exit 0
  ;;
esac
}

showinfo()
{
echo '┌──────────────────────┐'
echo '│ Информация о системе │'
echo '└──────────────────────┘'
echo "CPU: $cpu_cores x $cpu_clock MHz ($cpu_model)"
if [ $swap_mb -eq 0 ]; then echo "RAM: $mem_mb Mb"; else
echo "RAM: $mem_mb Mb (Плюс swap $swap_mb Mb)"; fi
#Определяем диск (делаем это при каждом выводе, т.к. данные меняются)
hdd_total=`df | awk '(NR == 2)' | awk '{print $2}'`
let "hdd_total_mb=$hdd_total / 1024"
hdd_free=`df | awk '(NR == 2)' | awk '{print $4}'`
let "hdd_free_mb=$hdd_free / 1024"
echo "HDD: $hdd_total_mb Mb (свободно $hdd_free_mb Mb)"
echo "ОС: $osfamily $osver2"
echo "Разрядность ОС: $arc bit"
echo "Версия ядра Linux: $kern"
echo "Ваш IP на интерфейсе $iface: $ip"
echo "Ваш внешний IP определяется как: $ipext"
}

about()
{
echo "Данную утилиту написал Павел Евтихов (aka Brizovsky).
г. Екатеринбург, Россия.
2016 год.
"
}
changelog()
{
wget $updpath/changelog.txt -r -N -nd
cat changelog.txt
br
}

log()
{
changelog
}

#-----------------
#задаем переменные
#-----------------
#Задаём переменную с нужным количеством пробелов, чтобы меню не разъезжалось от смены версии
title_full_len=${#title_full}
title_len=${#title}
space=""
      let "space_len=43-$title_full_len" 
      while [ "${#space}" -le $space_len ]
      do
      space=$space" "
      done

space2=""
      let "space2_len=30-$title_len" 
      while [ "${#space2}" -le $space2_len ]
      do
      space2=$space2" "
      done

filename='breeze.sh'
updpath='http://evtikhov.ru/'

#определяем сколько RAM
mem_total=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
swap_total=`cat /proc/meminfo | grep SwapTotal | awk '{print $2}'`
let "mem_mb=$mem_total / 1024"
let "swap_mb=$swap_total / 1024"

#Определяем данные процессора
cpu_clock=`cat /proc/cpuinfo | grep "cpu MHz" | awk {'print $4'} | sed q`
let "cpu_clock=$(printf %.0f $cpu_clock)"
#cpu_cores=`cat /proc/cpuinfo | grep "cpu cores" | awk {'print $4'}`
cpu_cores=`grep -o "processor" <<< "$(cat /proc/cpuinfo)" | wc -l`
cpu_model=`cat /proc/cpuinfo | grep "model name" | sed q | sed -e "s/model name//" | sed -e "s/://" | sed -e 's/^[ \t]*//' | sed -e "s/(tm)//g" | sed -e "s/(C)//g" | sed -e "s/(R)//g"`
#уберём двойные пробелы:
cpu_model=`echo $cpu_model | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g" | sed -e "s/  / /g"`

#Определяем ОС
if [ "$(cat /etc/redhat-release | awk {'print $2'})" == "release" ]
then
  osfamily=$(cat /etc/redhat-release | awk {'print $1'})
  osver2=$(cat /etc/redhat-release | awk {'print $3'})
else
  if [ "$(cat /etc/redhat-release | awk {'print $3'})" == "release" ]
    then
    osfamily=$(cat /etc/redhat-release | awk {'print $1'})" "$(cat /etc/redhat-release | awk {'print $2'})
    osver2=$(cat /etc/redhat-release | awk {'print $4'})
  else osver2=0
  fi
fi
osver1=`echo $osver2 | cut -c 1` #берём только первый символ от версии для определения поколения
if [ "$osfamily" == "CentOS Linux" ]; then osfamily="CentOS"; fi

#Определяем разрядность ОС
arc=`arch`
if [ "$arc" == "x86_64" ]; then arc=64 #В теории возможно обозначение "IA-64" и "AMD64", но я не встречал
else arc=32 #Чтобы не перебирать все возможные IA-32, x86, i686, i586 и т.д.
fi 

#определяем версию ядра Linux
kern=`uname -r | sed -e "s/-/ /" | awk {'print $1'}`

menu="
┌─────────────────────────────────────────────┐
│ $title $ver$space│
├───┬─────────────────────────────────────────┤
│ 1 │ Информация о системе                    │
├───┼─────────────────────────────────────────┤
│ 2 │ Работа с ОС                             │
├───┼─────────────────────────────────────────┤
│ 3 │ Установить панель управления хостингом  │
├───┼─────────────────────────────────────────┤
│ 4 │ Установка и настройка VPN-сервера       │
├───┼─────────────────────────────────────────┤
│ 5 │ Работа с Proxy                          │
├───┼─────────────────────────────────────────┤
│ 6 │ Работа с файлами и программами          │
├───┼─────────────────────────────────────────┤
│ 7 │ Очистка системы                         │
├───┼─────────────────────────────────────────┤
│ 8 │ Терминал                                │
├───┼─────────────────────────────────────────┤
│ 9 │ Обновить $title$space2│
├───┼─────────────────────────────────────────┤
│ 0 │ Выход                                   │
└───┴─────────────────────────────────────────┘
"
menu2="
● Работа с ОС:
│
│ ┌───┬──────────────────────────────────────┐
├─┤ 1 │ Добавить внешние репозитории         │
│ ├───┼──────────────────────────────────────┤
├─┤ 2 │ Обновить ОС                          │
│ ├───┼──────────────────────────────────────┤
├─┤ 3 │ Установить популярные приложения     │
│ ├───┼──────────────────────────────────────┤
├─┤ 4 │ Антивирус                            │
│ ├───┼──────────────────────────────────────┤
├─┤ 5 │ Firewall (iptables)                  │
│ ├───┼──────────────────────────────────────┤
├─┤ 6 │ Планировщик задач (cron)             │
│ ├───┼──────────────────────────────────────┤
├─┤ 7 │ Установить часовой пояс              │
│ ├───┼──────────────────────────────────────┤
├─┤ 8 │ Сменить пароль текущего пользователя │
│ ├───┼──────────────────────────────────────┤
└─┤ 0 │ Выйти на уровень вверх               │
  └───┴──────────────────────────────────────┘
"
menu24="
● Работа с ОС:
│
└─● Антивирус:
  │
  │ ┌───┬───────────────────────────┐
  ├─┤ 1 │ Установить Антивирус      │
  │ ├───┼───────────────────────────┤
  ├─┤ 2 │ Обновить антивирус        │
  │ ├───┼───────────────────────────┤
  ├─┤ 3 │ Проверить папку на вирусы │
  │ ├───┼───────────────────────────┤
  ├─┤ 4 │ Удалить антивирус         │
  │ ├───┼───────────────────────────┤
  └─┤ 0 │ Выйти на уровень вверх    │
    └───┴───────────────────────────┘
"
menu25="
● Работа с ОС:
│
└─● Firewall (iptables):
  │
  │ ┌───┬───────────────────────────────────────────────┐
  ├─┤ 1 │ Включить firewall (помощник настройки)        │
  │ ├───┼───────────────────────────────────────────────┤
  ├─┤ 2 │ Отключить firewall (рарешить все подключения) │
  │ ├───┼───────────────────────────────────────────────┤
  ├─┤ 3 │ Временно выключить firewall                   │
  │ ├───┼───────────────────────────────────────────────┤
  ├─┤ 4 │ Перезапустить firewall                        │
  │ ├───┼───────────────────────────────────────────────┤
  ├─┤ 5 │ Открыть порт в iptables                       │
  │ ├───┼───────────────────────────────────────────────┤
  ├─┤ 6 │ Посмотреть текущую политику firewall          │
  │ ├───┼───────────────────────────────────────────────┤
  ├─┤ 7 │ Сохранить текущие правила firewall            │
  │ ├───┼───────────────────────────────────────────────┤
  └─┤ 0 │ Выйти на уровень вверх                        │
    └───┴───────────────────────────────────────────────┘
"
menu26="
● Работа с ОС:
│
└─● Планировщик задач (cron):
  │
  │ ┌───┬─────────────────────────────────────────┐
  ├─┤ 1 │ Проверить запущен ли планировщик (cron) │
  │ ├───┼─────────────────────────────────────────┤
  ├─┤ 2 │ Перезапустить cron                      │
  │ ├───┼─────────────────────────────────────────┤
  ├─┤ 3 │ Добавить задание в планировщик (cron)   │
  │ ├───┼─────────────────────────────────────────┤
  ├─┤ 4 │ Открыть файл с заданиями cron           │
  │ ├───┼─────────────────────────────────────────┤
  ├─┤ 5 │ Выключить планировщик (cron)            │
  │ ├───┼─────────────────────────────────────────┤
  └─┤ 0 │ Выйти на уровень вверх                  │
    └───┴─────────────────────────────────────────┘
"
menu27="
● Работа с ОС:
│
└─● Установить часовой пояс:
  │
  │ ┌───┬────────────────────────┐
  ├─┤ 1 │ Калининград            │
  │ ├───┼────────────────────────┤
  ├─┤ 2 │ Москва                 │
  │ ├───┼────────────────────────┤
  ├─┤ 3 │ Самара                 │
  │ ├───┼────────────────────────┤
  ├─┤ 4 │ Екатеринбург           │
  │ ├───┼────────────────────────┤
  ├─┤ 5 │ Новосибирск            │
  │ ├───┼────────────────────────┤
  ├─┤ 6 │ Красноярск             │
  │ ├───┼────────────────────────┤
  ├─┤ 7 │ Иркутск                │
  │ ├───┼────────────────────────┤
  ├─┤ 8 │ Владивосток            │
  │ ├───┼────────────────────────┤
  ├─┤ 9 │ Камчатка               │
  │ ├───┼────────────────────────┤
  └─┤ 0 │ Выйти на уровень вверх │
    └───┴────────────────────────┘
"
menu3="
● Установить панель управления хостингом:
│
│ ┌───┬────────────────────────┐
├─┤ 1 │ ISPmanager 4           │
│ ├───┼────────────────────────┤
├─┤ 2 │ ISPmanager 5           │
│ ├───┼────────────────────────┤
├─┤ 3 │ Vesta CP               │
│ ├───┼────────────────────────┤
├─┤ 4 │ Webuzo                 │
│ ├───┼────────────────────────┤
├─┤ 5 │ CentOS Web Panel (CWP) │
│ ├───┼────────────────────────┤
├─┤ 6 │ ZPanel CP              │
│ ├───┼────────────────────────┤
├─┤ 7 │ Ajenti                 │
│ ├───┼────────────────────────┤
└─┤ 0 │ Выйти на уровень вверх │
  └───┴────────────────────────┘
"
menu4="
● Установка и настройка VPN-сервера:
│
│ ┌───┬────────────────────────────────────────────────┐
├─┤ 1 │ Установить VPN-сервер (pptpd)                  │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 2 │ Добавить пользователей VPN                     │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 3 │ Открыть файл с логинами/паролями пользователей │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 4 │ Добавить правила для работы VPN в IPTables     │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 5 │ Удалить VPN-сервер                             │
│ ├───┼────────────────────────────────────────────────┤
└─┤ 0 │ Выйти на уровень вверх                         │
  └───┴────────────────────────────────────────────────┘
"
menu5="
● Работа с Proxy:
│
│ ┌───┬────────────────────────────────────────────────┐
├─┤ 1 │ Установить Proxy-сервер (на базе Squid)        │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 2 │ Удалить Proxy (Squid)                          │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 3 │ Поменять MTU для интерфейса                    │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 4 │ Открыть файл настроек Squid                    │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 5 │ Добавить пользователя Proxy                    │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 6 │ Открыть файл с логинами/паролями пользователей │
│ ├───┼────────────────────────────────────────────────┤
├─┤ 7 │ Перезапустить сервис Proxy (Squid)             │
│ ├───┼────────────────────────────────────────────────┤
└─┤ 0 │ Выйти на уровень вверх                         │
  └───┴────────────────────────────────────────────────┘
"
menu6="
● Работа с файлами и программами:
│
│ ┌───┬─────────────────────────────────────────────────────┐
├─┤ 1 │ Установить какую-либо программу                     │
│ ├───┼─────────────────────────────────────────────────────┤
├─┤ 2 │ Удалить какую-либо программу                        │
│ ├───┼─────────────────────────────────────────────────────┤
├─┤ 3 │ Удалить какую-либо программу со всеми зависимостями │
│ ├───┼─────────────────────────────────────────────────────┤
├─┤ 4 │ Посмотреть сколько свободного места на диске        │
│ ├───┼─────────────────────────────────────────────────────┤
└─┤ 0 │ Выйти на уровень вверх                              │
  └───┴─────────────────────────────────────────────────────┘
"
menu7="
● Очистка системы:
│
│ ┌───┬──────────────────────────────────────────────┐
├─┤ 1 │ Удалить старые установочные пакеты (кэш yum) │
│ ├───┼──────────────────────────────────────────────┤
├─┤ 2 │ Удалить логи Apache, Nginx                   │
│ ├───┼──────────────────────────────────────────────┤
├─┤ 3 │ Удалить логи Apache конкретного пользователя │
│ ├───┼──────────────────────────────────────────────┤
├─┤ 4 │ Посмотреть сколько свободного места на диске │
│ ├───┼──────────────────────────────────────────────┤
└─┤ 0 │ Выйти на уровень вверх                       │
  └───┴──────────────────────────────────────────────┘
"

#-----------------
#Интерфейс
#-----------------
repeat=true
chosen=0
chosen2=0
while [ "$repeat" = "true" ] #выводим меню, пока не надо выйти
do

#пошёл вывод
if [ $chosen -eq 0 ]; then #выводим меню, только если ещё никуда не заходили
menu
myread_dig pick
else
pick=$chosen
fi

case "$pick" in
1) #Информация о системе
clear
showinfo
br
echo "Вычисляем Ваш IP на интерфейсе..."
whatismyip
clear
showinfo
br
echo "Вычисляем Ваш внешний IP..."
whatismyipext
clear
showinfo
br
wait
;;
2) #Работа с ОС
chosen=2
clear
if [ $chosen2 -eq 0 ]; then #выводим меню, только если ещё никуда не заходили
echo "$title"
echo "$menu2"
myread_dig pick
else
pick=$chosen2
fi
    case "$pick" in
    1) #Добавить внешние репозитории
      case "$osver1" in
        4)
        repo4
        ;;
        5)
        repo5
        ;;
        6)
        repo6
        ;;
        7)
        repo7
        ;;
        0)
        echo "Мы не смогли определить версию Вашей ОС, но Вы можете выбрать её сами на свой страх и риск:"
        echo "5) CentOS 5.x x64 (или другой дистрибутив на базе RHEL 5)"
        echo "6) CentOS 6.x x64 (или другой дистрибутив на базе RHEL 6)"
        echo "7) CentOS 7.x x64 (или другой дистрибутив на базе RHEL 7)"
        echo "0) Любая другая ОС"
        myread_dig osver_user
        case "$osver_user" in
          5)
          repo5
          ;;
          6)
          repo6
          ;;
          7)
          repo7
          ;;
          0)
          echo "Никакие другие ОС пока не поддерживаются. Но планируется расширение поддержки"
          wait
          ;;
        esac
        ;;
        *) #по идее мы НИКОГДА не должны попасть сюда, исходя из того, как строится проверка
        echo "Произошла непредвиденная ошибка при определении версии CentOS. Выходим."
        exit 0
        ;;
      esac   
    ;;
    2) #Обновить ОС
    echo "Начинаем обновление ОС..."
    yum update -y
    echo "ОС была успешно обновлена."
    wait    
    ;;
    3) #Установить популярные приложения
    echo "Сечас будут установлены следующие программы:"
    echo "mc - Midnigh Commander (файловый менеджер)"
    echo "htop (более продвинутый мониторинг ресурсов)"
    echo "nano (простейший текстовый редактор)"
    if [ $osver1 -ne 5 ]; then echo "аддон для yum, который позволяет удалять программы со всеми зависимостями"; fi #Не для CentOS 5
    if [ $osver1 -eq 7 ]; then echo "net-tools (чтобы вернуть команду ifconfig)"; fi #Только для CentOS 7
    br
    wait
    echo "Начинаем установку программ..."
    yum -y install mc
    yum -y install htop
    yum -y install nano
    if [ $osver1 -ne 5 ]; then yum -y install yum-remove-with-leaves; fi #Не для CentOS 5
    if [ $osver1 -eq 7 ]; then yum -y install net-tools; fi #Только для CentOS 7
    br
    echo "Программы были установлены."
    wait    
    ;;
    4) #Антивирус
    chosen2=4
    clear
    echo "$title"
    echo "$menu24"
    myread_dig pick
    case "$pick" in
      1) #Установить Антивирус
      echo "сейчас будет установлен антивирус ClamAV."
      wait
      yum -y install clamav clamd
      br
      echo "Антивирус был установлен. Сейчас обновим антивирусные базы"
      br
      freshclam
      br
      echo "Базы были обновлены."
      br
      echo "Сейчас мы попробуем запустить этот сервис (демон)."
      chkconfig --levels 235 clamd on
      service clamd restart
      br
      echo "Всё готово!"
      wait
      ;;
      2) #Обновить антивирус
      installed clamscan
      if [ $exist == true ]; then
        freshclam
        br
        wait
      else
        echo "У вас не установлен антивирус."
      wait
      fi
      ;;
      3) #Проверить папку на вирусы
      installed clamscan
      if [ $exist == true ]; then
        echo 'Укажите папку, которую нужно просканировать (введите "/", если весь сервер):'
        read scandir
        echo "Нужно ли сохранить лог сканирования в файл?"
        myread_yn avlog
        case "$avlog" in
         y|Y)
           echo 'Укажите путь для сохранения лога сканирования (начиная с "/")'
           read avlogdir
           echo "Сканируем..."
           br
           clamscan $scandir -r -i --log=$avlogdir
         ;;
         n|N|т|Т)
         echo "Сканируем..."
         br
         clamscan $scandir -r
         ;;
         *)
         echo "Неправильный выбор"
         wait
         ;;
        esac
      br
      wait
      else
        echo "У вас не установлен антивирус."
        wait
      fi
      ;;
      4) #Удалить антивирус
      uninstall clamav*
      br
      wait
      ;;
      0)
      chosen2=0
      ;;
    esac
    ;;
    5) #Firewall (iptables)
    chosen2=5
    clear
    echo "$title"
    echo "$menu25"
    myread_dig pick
    case "$pick" in
      1) #Включить firewall (помощник настройки)
      clear
      echo "Сейчас будут удалены все правила iptables (если они были), установлен запрет"
      echo "на обработку всех входящих и исходящих пакетов, кроме внутреннего обмена"
      echo "пакетами (localhost), SSH-подключения (22 порт) и всех связанных пакетов"
      echo "(состояние RELATED и ESTABLISHED). А далее вам будет предложен вариант открыть"
      echo "самые распространенные порты (с вашего разрешения). Продолжить?"
      myread_yn ans
      case "$ans" in
        y|Y)
        echo "Начинаем настройку iptables"
		#Проверка на CentOS 7
        if [ $osver1 -eq 7 ]; then 
        systemctl stop firewalld
		systemctl mask firewalld
		myinstall iptables-services | tee > null
		systemctl enable iptables
        fi
        iptables -F
        iptables -X
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A OUTPUT -o lo -j ACCEPT
        iptables -A INPUT -p tcp --dport 22 -j ACCEPT
        iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
        iptables -P INPUT DROP
        iptables -P OUTPUT DROP
        iptables -P FORWARD DROP
        iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
        br
        echo "Готово. Хотите, чтобы этот компьютер пинговался с других компьютеров?"
        myread_yn ans
        case "$ans" in
          y|Y)
          iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
          iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
          iptables -A OUTPUT -p icmp -j ACCEPT
          ;;
        esac
        br
        echo "Часто люди на серверах открывают следующие порты:"
        echo "web: 80, 443"
        echo "ftp: 21"
        echo "ntp: 123 (для синхронизации часов)"
        echo "dns: 54"
        echo "Хотите открыть их сейчас?"
        myread_yn ans
        case "$ans" in
          y|Y)
          iptables -A INPUT -p tcp --dport 21 -j ACCEPT
          iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
          iptables -A INPUT -p tcp --dport 80 -j ACCEPT
          iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
          iptables -A INPUT -p tcp --dport 443 -j ACCEPT
          iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
          iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
          iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
          ;;
        esac
        br
        echo "Хотите открыть порт 3128 для Proxy?"
        myread_yn ans
        case "$ans" in
          y|Y)
          iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
          ;;
        esac
        br
        echo "Хотите открыть порты для VPN-сервера (PPTP)?"
        myread_yn ans
        case "$ans" in
          y|Y)
          whatismyip_full
          iptables -A INPUT -p 47 -j ACCEPT
          iptables -A OUTPUT -p 47 -j ACCEPT
          iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
          iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT
          iptables -t nat -I POSTROUTING -j SNAT --to $ip
          iptables -A FORWARD -s 10.1.0.0/24 -j ACCEPT
          iptables -A FORWARD -d 10.1.0.0/24 -j ACCEPT
          ;;
        esac
        iptables_save
        br
        echo "Firewall был настроен. Остальные порты вы можете открыть самостоятельно,"
        echo 'воспользовавшись разделом "Открыть порт в iptables".'
        wait
        ;;
      esac
      ;;
      2) #Выключить firewall (рарешить все подключения)
	  echo "Сейчас будут удалены все правила iptables, после чего будут разрешены все подключения. Продолжить?"
      myread_yn ans
      case "$ans" in
        y|Y)
        iptables -F
        iptables -X
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT
        ;;
      esac
      iptables_save
      br
      echo "Готово. Iptables продолжает работать, но в нём разрешены все подключения."
      wait
      ;;
      3) #Временно выключить firewall
      iptables -F
      iptables -X
      iptables -P INPUT ACCEPT
      iptables -P FORWARD ACCEPT
      iptables -P OUTPUT ACCEPT
      br
      echo "Готово. Были временно сброшены все правила для iptables. Сейчас проходят все"
      echo "подключения. После перезагрузки сервера или перезапуска iptables всё будет"
      echo "как прежде (применятся все правила, которые были до этого)."
      br
      wait
      ;;
      4) #Перезапустить firewall
      if [ $osver1 -eq 7 ]; then 
	  myinstall iptables-services | tee > null
      fi
      service iptables restart
      br
      echo "Готово. "
      wait
      ;;
      5) #Открыть порт в iptables
      echo "Укажите в какую сторону вы хотите открыть порт:"
      echo "1) Входящие соединения (чтобы к этому серверу можно было подключиться по заданному порту)"
      echo "2) Исходящие соединения (чтобы этот сервер мог подключиться к другим компьютерам по заданному порту)"
      myread_dig taffic_type
      case "$taffic_type" in
      1)
      taffic_type=in
      ;;
      2)
      taffic_type=out
      ;;
      *)
      echo "Неправильный выбор. Аварийный выход."
      wait
      exit
      ;;
      esac
      br
      echo "Укажите какой порт вы хотите открыть:"
      read port
      br
      echo "Выберите протокол, по которому его нужно открыть:"
      echo "1) TCP"
      echo "2) UDP"
      echo "3) TCP и UDP"
      myread_dig protocol
      case "$protocol" in
		1)
		openport $taffic_type tcp $port
		;;
		2)
		open
    
            

© Habrahabr.ru