KarelWintersky revised this gist 21 hours ago. Go to revision
1 file changed, 26 insertions, 12 deletions
install.sh
| @@ -68,7 +68,7 @@ ask_proxy() { | |||
| 68 | 68 | read -p "Use proxy? " USE_PROXY | |
| 69 | 69 | if [[ "$USE_PROXY" =~ ^[Yy]$ ]]; then | |
| 70 | 70 | echo -e "${ANSI_YELLOW}Введите URL прокси-сервера (например: http://192.168.111.87:3142):${ANSI_RESET}" | |
| 71 | - | read -p "Proxy URL: " PROXY_URL | |
| 71 | + | read -p "Proxy URL: " -i "http://192.168.111.87:3142" PROXY_URL | |
| 72 | 72 | if [ -n "$PROXY_URL" ]; then | |
| 73 | 73 | configure_proxy "$PROXY_URL" | |
| 74 | 74 | else | |
| @@ -569,10 +569,25 @@ list_format=user | |||
| 569 | 569 | current_is_left=false | |
| 570 | 570 | other_dir=/root | |
| 571 | 571 | EOF | |
| 572 | + | } | |
| 573 | + | ||
| 574 | + | # Обновление GPG ключей Debian | |
| 575 | + | fix_debian_keys() { | |
| 576 | + | echo -e "${ANSI_GREEN}=== Обновление GPG ключей Debian ===${ANSI_RESET}" | |
| 572 | 577 | ||
| 578 | + | # Удалить старые проблемные ключи | |
| 579 | + | apt-key del 54404762BBB6E853 2>/dev/null || true | |
| 580 | + | apt-key del 6ED0E7B82643E131 2>/dev/null || true | |
| 573 | 581 | ||
| 582 | + | # Установка свежих ключей | |
| 583 | + | apt-get update --allow-insecure-repositories || true | |
| 584 | + | apt-get install -y debian-archive-keyring --allow-unauthenticated | |
| 574 | 585 | ||
| 586 | + | # Очистка кэша apt | |
| 587 | + | apt-get clean | |
| 588 | + | rm -rf /var/lib/apt/lists/* | |
| 575 | 589 | ||
| 590 | + | echo -e "${ANSI_GREEN}Ключи обновлены${ANSI_RESET}" | |
| 576 | 591 | } | |
| 577 | 592 | ||
| 578 | 593 | # ==================== ОСНОВНАЯ ЛОГИКА ==================== | |
| @@ -582,35 +597,34 @@ main() { | |||
| 582 | 597 | ||
| 583 | 598 | echo -e "${ANSI_GREEN}=== Настройка системы ===${ANSI_RESET}" | |
| 584 | 599 | ||
| 585 | - | # Сбор данных | |
| 600 | + | configure_root_history | |
| 601 | + | ||
| 586 | 602 | NEW_HOSTNAME=$(ask_hostname) | |
| 587 | 603 | ||
| 588 | 604 | CREATE_USER=$(ask_create_user) | |
| 605 | + | if [ "$CREATE_USER" = "yes" ]; then | |
| 606 | + | NEW_USER=$(ask_username) | |
| 607 | + | USER_PASS=$(ask_password "$NEW_USER") | |
| 608 | + | ||
| 609 | + | create_user "$NEW_USER" "$USER_PASS" | |
| 610 | + | configure_user_history "$NEW_USER" | |
| 611 | + | fi | |
| 589 | 612 | ||
| 590 | 613 | ask_proxy | |
| 591 | 614 | ||
| 592 | 615 | # Выполнение настроек | |
| 593 | 616 | set_hostname "$NEW_HOSTNAME" | |
| 594 | 617 | add_mephi_repository | |
| 618 | + | fix_debian_keys | |
| 595 | 619 | update_system | |
| 596 | 620 | install_packages | |
| 597 | 621 | configure_ssh | |
| 598 | 622 | configure_locale | |
| 599 | 623 | configure_journald | |
| 600 | 624 | clean_git_docs | |
| 601 | - | configure_root_history | |
| 602 | 625 | ||
| 603 | 626 | make_motd_generator | |
| 604 | 627 | ||
| 605 | - | if [ "$CREATE_USER" = "yes" ]; then | |
| 606 | - | NEW_USER=$(ask_username) | |
| 607 | - | USER_PASS=$(ask_password "$NEW_USER") | |
| 608 | - | ||
| 609 | - | create_user "$NEW_USER" "$USER_PASS" | |
| 610 | - | configure_user_history "$NEW_USER" | |
| 611 | - | fi | |
| 612 | - | ||
| 613 | - | ||
| 614 | 628 | install_midnight_commanger | |
| 615 | 629 | ||
| 616 | 630 | finish_setup | |
KarelWintersky revised this gist 21 hours ago. Go to revision
No changes
KarelWintersky revised this gist 21 hours ago. Go to revision
1 file changed, 38 insertions, 17 deletions
install.sh
| @@ -25,28 +25,41 @@ ask_hostname() { | |||
| 25 | 25 | echo "$NEW_HOSTNAME" | |
| 26 | 26 | } | |
| 27 | 27 | ||
| 28 | + | # Запрос - создавать ли пользователя | |
| 29 | + | ask_create_user() { | |
| 30 | + | echo -e "${ANSI_YELLOW}Создать нового пользователя? (y/n):${ANSI_RESET}" | |
| 31 | + | read -p "Create user? " CREATE_USER | |
| 32 | + | if [[ "$CREATE_USER" =~ ^[Yy]$ ]]; then | |
| 33 | + | echo "yes" | |
| 34 | + | else | |
| 35 | + | echo "no" | |
| 36 | + | fi | |
| 37 | + | } | |
| 38 | + | ||
| 28 | 39 | # Запрос имени пользователя | |
| 29 | 40 | ask_username() { | |
| 30 | - | echo -e "${ANSI_YELLOW}Введите имя нового пользователя:${ANSI_RESET}" | |
| 31 | - | read -p "Username: " NEW_USER | |
| 32 | - | if [ -z "$NEW_USER" ]; then | |
| 33 | - | echo -e "${ANSI_RED}Имя пользователя не может быть пустым.${ANSI_RESET}" | |
| 41 | + | local username | |
| 42 | + | echo -e "${ANSI_YELLOW}Введите имя нового пользователя:${ANSI_RESET}" >&2 | |
| 43 | + | read -p "Username: " username | |
| 44 | + | if [ -z "$username" ]; then | |
| 45 | + | echo -e "${ANSI_RED}Имя пользователя не может быть пустым.${ANSI_RESET}" >&2 | |
| 34 | 46 | exit 1 | |
| 35 | 47 | fi | |
| 36 | - | echo "$NEW_USER" | |
| 48 | + | echo "$username" | |
| 37 | 49 | } | |
| 38 | 50 | ||
| 39 | 51 | # Запрос пароля | |
| 40 | 52 | ask_password() { | |
| 41 | 53 | local username=$1 | |
| 42 | - | echo -e "${ANSI_YELLOW}Введите пароль для пользователя $username:${ANSI_RESET}" | |
| 43 | - | read -s -p "Password: " USER_PASS | |
| 44 | - | echo | |
| 45 | - | if [ -z "$USER_PASS" ]; then | |
| 46 | - | echo -e "${ANSI_RED}Пароль не может быть пустым.${ANSI_RESET}" | |
| 54 | + | local user_pass | |
| 55 | + | echo -e "${ANSI_YELLOW}Введите пароль для пользователя $username:${ANSI_RESET}" >&2 | |
| 56 | + | read -s -p "Password: " user_pass | |
| 57 | + | echo >&2 | |
| 58 | + | if [ -z "$user_pass" ]; then | |
| 59 | + | echo -e "${ANSI_RED}Пароль не может быть пустым.${ANSI_RESET}" >&2 | |
| 47 | 60 | exit 1 | |
| 48 | 61 | fi | |
| 49 | - | echo "$USER_PASS" | |
| 62 | + | echo "$user_pass" | |
| 50 | 63 | } | |
| 51 | 64 | ||
| 52 | 65 | # Запрос настройки прокси | |
| @@ -54,7 +67,7 @@ ask_proxy() { | |||
| 54 | 67 | echo -e "\n${ANSI_YELLOW}Использовать прокси-сервер apt-cacher-ng? (y/n):${ANSI_RESET}" | |
| 55 | 68 | read -p "Use proxy? " USE_PROXY | |
| 56 | 69 | if [[ "$USE_PROXY" =~ ^[Yy]$ ]]; then | |
| 57 | - | echo -e "${ANSI_YELLOW}Введите URL прокси-сервера (например: http://192.168.1.100:3142):${ANSI_RESET}" | |
| 70 | + | echo -e "${ANSI_YELLOW}Введите URL прокси-сервера (например: http://192.168.111.87:3142):${ANSI_RESET}" | |
| 58 | 71 | read -p "Proxy URL: " PROXY_URL | |
| 59 | 72 | if [ -n "$PROXY_URL" ]; then | |
| 60 | 73 | configure_proxy "$PROXY_URL" | |
| @@ -571,8 +584,9 @@ main() { | |||
| 571 | 584 | ||
| 572 | 585 | # Сбор данных | |
| 573 | 586 | NEW_HOSTNAME=$(ask_hostname) | |
| 574 | - | NEW_USER=$(ask_username) | |
| 575 | - | USER_PASS=$(ask_password "$NEW_USER") | |
| 587 | + | ||
| 588 | + | CREATE_USER=$(ask_create_user) | |
| 589 | + | ||
| 576 | 590 | ask_proxy | |
| 577 | 591 | ||
| 578 | 592 | # Выполнение настроек | |
| @@ -583,13 +597,20 @@ main() { | |||
| 583 | 597 | configure_ssh | |
| 584 | 598 | configure_locale | |
| 585 | 599 | configure_journald | |
| 586 | - | create_user "$NEW_USER" "$USER_PASS" | |
| 587 | - | configure_user_history "$NEW_USER" | |
| 588 | - | configure_root_history | |
| 589 | 600 | clean_git_docs | |
| 601 | + | configure_root_history | |
| 590 | 602 | ||
| 591 | 603 | make_motd_generator | |
| 592 | 604 | ||
| 605 | + | if [ "$CREATE_USER" = "yes" ]; then | |
| 606 | + | NEW_USER=$(ask_username) | |
| 607 | + | USER_PASS=$(ask_password "$NEW_USER") | |
| 608 | + | ||
| 609 | + | create_user "$NEW_USER" "$USER_PASS" | |
| 610 | + | configure_user_history "$NEW_USER" | |
| 611 | + | fi | |
| 612 | + | ||
| 613 | + | ||
| 593 | 614 | install_midnight_commanger | |
| 594 | 615 | ||
| 595 | 616 | finish_setup | |
KarelWintersky revised this gist 21 hours ago. Go to revision
1 file changed, 4 insertions, 4 deletions
install.sh
| @@ -3,10 +3,10 @@ | |||
| 3 | 3 | set -e | |
| 4 | 4 | ||
| 5 | 5 | # Цвета для вывода | |
| 6 | - | ANSI_RED := $(tput -Txterm setaf 1) | |
| 7 | - | ANSI_GREEN := $(tput -Txterm setaf 2) | |
| 8 | - | ANSI_YELLOW := $(tput -Txterm setaf 3) | |
| 9 | - | ANSI_RESET := $(tput -Txterm sgr0) | |
| 6 | + | ANSI_RED=$(tput -Txterm setaf 1) | |
| 7 | + | ANSI_GREEN=$(tput -Txterm setaf 2) | |
| 8 | + | ANSI_YELLOW=$(tput -Txterm setaf 3) | |
| 9 | + | ANSI_RESET=$(tput -Txterm sgr0) | |
| 10 | 10 | ||
| 11 | 11 | # ==================== ФУНКЦИИ ==================== | |
| 12 | 12 | ||
KarelWintersky revised this gist 21 hours ago. Go to revision
1 file changed, 4 insertions, 4 deletions
install.sh
| @@ -3,10 +3,10 @@ | |||
| 3 | 3 | set -e | |
| 4 | 4 | ||
| 5 | 5 | # Цвета для вывода | |
| 6 | - | ANSI_RED := $(shell tput -Txterm setaf 1) | |
| 7 | - | ANSI_GREEN := $(shell tput -Txterm setaf 2) | |
| 8 | - | ANSI_YELLOW := $(shell tput -Txterm setaf 3) | |
| 9 | - | ANSI_RESET := $(shell tput -Txterm sgr0) | |
| 6 | + | ANSI_RED := $(tput -Txterm setaf 1) | |
| 7 | + | ANSI_GREEN := $(tput -Txterm setaf 2) | |
| 8 | + | ANSI_YELLOW := $(tput -Txterm setaf 3) | |
| 9 | + | ANSI_RESET := $(tput -Txterm sgr0) | |
| 10 | 10 | ||
| 11 | 11 | # ==================== ФУНКЦИИ ==================== | |
| 12 | 12 | ||
KarelWintersky revised this gist 21 hours ago. Go to revision
1 file changed, 4 insertions, 4 deletions
install.sh
| @@ -3,10 +3,10 @@ | |||
| 3 | 3 | set -e | |
| 4 | 4 | ||
| 5 | 5 | # Цвета для вывода | |
| 6 | - | ANSI_RED='\033[0;31m' | |
| 7 | - | ANSI_GREEN='\033[0;32m' | |
| 8 | - | ANSI_YELLOW='\033[1;33m' | |
| 9 | - | ANSI_RESET='\033[0m' | |
| 6 | + | ANSI_RED := $(shell tput -Txterm setaf 1) | |
| 7 | + | ANSI_GREEN := $(shell tput -Txterm setaf 2) | |
| 8 | + | ANSI_YELLOW := $(shell tput -Txterm setaf 3) | |
| 9 | + | ANSI_RESET := $(shell tput -Txterm sgr0) | |
| 10 | 10 | ||
| 11 | 11 | # ==================== ФУНКЦИИ ==================== | |
| 12 | 12 | ||
KarelWintersky revised this gist 22 hours ago. Go to revision
1 file changed, 3 insertions, 3 deletions
install.sh
| @@ -365,7 +365,7 @@ EOF | |||
| 365 | 365 | install_midnight_commanger() { | |
| 366 | 366 | apt-get -y install mc | |
| 367 | 367 | ||
| 368 | - | write_config_file "/root/.config/mc/ini" false <<< 'EOF' | |
| 368 | + | write_config_file "/root/.config/mc/ini" false << 'EOF' | |
| 369 | 369 | [Midnight-Commander] | |
| 370 | 370 | verbose=true | |
| 371 | 371 | shell_patterns=true | |
| @@ -517,7 +517,7 @@ Modified git files=git ls-files --modified | |||
| 517 | 517 | ||
| 518 | 518 | EOF | |
| 519 | 519 | ||
| 520 | - | write_config_file "/root/.config/mc/panels.ini" false <<< 'EOF' | |
| 520 | + | write_config_file "/root/.config/mc/panels.ini" false << 'EOF' | |
| 521 | 521 | [New Left Panel] | |
| 522 | 522 | display=listing | |
| 523 | 523 | reverse=false | |
| @@ -556,7 +556,7 @@ list_format=user | |||
| 556 | 556 | current_is_left=false | |
| 557 | 557 | other_dir=/root | |
| 558 | 558 | EOF | |
| 559 | - | ||
| 559 | + | ||
| 560 | 560 | ||
| 561 | 561 | ||
| 562 | 562 | ||
KarelWintersky revised this gist 22 hours ago. Go to revision
1 file changed, 520 insertions, 92 deletions
install.sh
| @@ -8,48 +8,88 @@ ANSI_GREEN='\033[0;32m' | |||
| 8 | 8 | ANSI_YELLOW='\033[1;33m' | |
| 9 | 9 | ANSI_RESET='\033[0m' | |
| 10 | 10 | ||
| 11 | - | # Проверка, что скрипт запущен от root | |
| 12 | - | if [ "$EUID" -ne 0 ]; then | |
| 13 | - | echo -e "${ANSI_RED}Ошибка: скрипт должен запускаться от root${ANSI_RESET}" | |
| 14 | - | exit 1 | |
| 15 | - | fi | |
| 11 | + | # ==================== ФУНКЦИИ ==================== | |
| 16 | 12 | ||
| 17 | - | echo -e "${ANSI_GREEN}=== Настройка системы ===${ANSI_RESET}" | |
| 13 | + | # Проверка прав root | |
| 14 | + | check_root() { | |
| 15 | + | if [ "$EUID" -ne 0 ]; then | |
| 16 | + | echo -e "${ANSI_RED}Ошибка: скрипт должен запускаться от root${ANSI_RESET}" | |
| 17 | + | exit 1 | |
| 18 | + | fi | |
| 19 | + | } | |
| 18 | 20 | ||
| 19 | 21 | # Запрос имени хоста | |
| 20 | - | echo -e "${ANSI_YELLOW}Введите новое имя хоста:${ANSI_RESET}" | |
| 21 | - | read -p "Hostname: " NEW_HOSTNAME | |
| 22 | - | if [ -z "$NEW_HOSTNAME" ]; then | |
| 23 | - | echo -e "${ANSI_RED}Имя хоста не может быть пустым.${ANSI_RESET}" | |
| 24 | - | exit 1 | |
| 25 | - | fi | |
| 22 | + | ask_hostname() { | |
| 23 | + | local current_hostname=$(hostname) | |
| 24 | + | read -e -p "${ANSI_YELLOW}Введите имя хоста: (текущее: $current_hostname) ${ANSI_RESET}" -i "${current_hostname}" NEW_HOSTNAME | |
| 25 | + | echo "$NEW_HOSTNAME" | |
| 26 | + | } | |
| 26 | 27 | ||
| 27 | 28 | # Запрос имени пользователя | |
| 28 | - | echo -e "${ANSI_YELLOW}Введите имя нового пользователя:${ANSI_RESET}" | |
| 29 | - | read -p "Username: " NEW_USER | |
| 30 | - | if [ -z "$NEW_USER" ]; then | |
| 31 | - | echo -e "${ANSI_RED}Имя пользователя не может быть пустым.${ANSI_RESET}" | |
| 32 | - | exit 1 | |
| 33 | - | fi | |
| 34 | - | ||
| 35 | - | # Запрос пароля для нового пользователя | |
| 36 | - | echo -e "${ANSI_YELLOW}Введите пароль для пользователя $NEW_USER:${ANSI_RESET}" | |
| 37 | - | read -s -p "Password: " USER_PASS | |
| 38 | - | echo | |
| 39 | - | if [ -z "$USER_PASS" ]; then | |
| 40 | - | echo -e "${ANSI_RED}Пароль не может быть пустым.${ANSI_RESET}" | |
| 41 | - | exit 1 | |
| 42 | - | fi | |
| 43 | - | ||
| 44 | - | echo -e "\n${ANSI_GREEN}=== Установка имени хоста: $NEW_HOSTNAME ===${ANSI_RESET}" | |
| 45 | - | hostnamectl set-hostname "$NEW_HOSTNAME" | |
| 46 | - | # Обновление /etc/hosts | |
| 47 | - | sed -i "s/^127.0.1.1.*/127.0.1.1\t$NEW_HOSTNAME/" /etc/hosts | |
| 48 | - | echo -e "${ANSI_GREEN}Имя хоста установлено.${ANSI_RESET}" | |
| 49 | - | ||
| 50 | - | # Функция добавления репозитория MEPHI | |
| 29 | + | ask_username() { | |
| 30 | + | echo -e "${ANSI_YELLOW}Введите имя нового пользователя:${ANSI_RESET}" | |
| 31 | + | read -p "Username: " NEW_USER | |
| 32 | + | if [ -z "$NEW_USER" ]; then | |
| 33 | + | echo -e "${ANSI_RED}Имя пользователя не может быть пустым.${ANSI_RESET}" | |
| 34 | + | exit 1 | |
| 35 | + | fi | |
| 36 | + | echo "$NEW_USER" | |
| 37 | + | } | |
| 38 | + | ||
| 39 | + | # Запрос пароля | |
| 40 | + | ask_password() { | |
| 41 | + | local username=$1 | |
| 42 | + | echo -e "${ANSI_YELLOW}Введите пароль для пользователя $username:${ANSI_RESET}" | |
| 43 | + | read -s -p "Password: " USER_PASS | |
| 44 | + | echo | |
| 45 | + | if [ -z "$USER_PASS" ]; then | |
| 46 | + | echo -e "${ANSI_RED}Пароль не может быть пустым.${ANSI_RESET}" | |
| 47 | + | exit 1 | |
| 48 | + | fi | |
| 49 | + | echo "$USER_PASS" | |
| 50 | + | } | |
| 51 | + | ||
| 52 | + | # Запрос настройки прокси | |
| 53 | + | ask_proxy() { | |
| 54 | + | echo -e "\n${ANSI_YELLOW}Использовать прокси-сервер apt-cacher-ng? (y/n):${ANSI_RESET}" | |
| 55 | + | read -p "Use proxy? " USE_PROXY | |
| 56 | + | if [[ "$USE_PROXY" =~ ^[Yy]$ ]]; then | |
| 57 | + | echo -e "${ANSI_YELLOW}Введите URL прокси-сервера (например: http://192.168.1.100:3142):${ANSI_RESET}" | |
| 58 | + | read -p "Proxy URL: " PROXY_URL | |
| 59 | + | if [ -n "$PROXY_URL" ]; then | |
| 60 | + | configure_proxy "$PROXY_URL" | |
| 61 | + | else | |
| 62 | + | echo -e "${ANSI_RED}URL прокси не введен, пропускаем${ANSI_RESET}" | |
| 63 | + | fi | |
| 64 | + | fi | |
| 65 | + | } | |
| 66 | + | ||
| 67 | + | # Настройка прокси для apt | |
| 68 | + | configure_proxy() { | |
| 69 | + | local proxy_url=$1 | |
| 70 | + | echo -e "${ANSI_GREEN}Настройка прокси для apt...${ANSI_RESET}" | |
| 71 | + | cat > /etc/apt/apt.conf.d/02aptproxy << EOF | |
| 72 | + | Acquire::http::proxy "$proxy_url"; | |
| 73 | + | Acquire::ftp::proxy "$proxy_url"; | |
| 74 | + | EOF | |
| 75 | + | echo -e "${ANSI_GREEN}Прокси настроен в /etc/apt/apt.conf.d/02aptproxy${ANSI_RESET}" | |
| 76 | + | } | |
| 77 | + | ||
| 78 | + | # Установка имени хоста | |
| 79 | + | set_hostname() { | |
| 80 | + | local hostname=$1 | |
| 81 | + | echo -e "\n${ANSI_GREEN}=== Установка имени хоста: $hostname ===${ANSI_RESET}" | |
| 82 | + | hostnamectl set-hostname "$hostname" | |
| 83 | + | if grep -q "^127.0.1.1" /etc/hosts; then | |
| 84 | + | sed -i "s/^127.0.1.1.*/127.0.1.1\t$hostname/" /etc/hosts | |
| 85 | + | else | |
| 86 | + | echo "127.0.1.1\t$hostname" >> /etc/hosts | |
| 87 | + | fi | |
| 88 | + | echo -e "${ANSI_GREEN}Имя хоста установлено.${ANSI_RESET}" | |
| 89 | + | } | |
| 90 | + | ||
| 91 | + | # Добавление репозитория MEPHI | |
| 51 | 92 | add_mephi_repository() { | |
| 52 | - | # Определение версии Debian | |
| 53 | 93 | . /etc/os-release 2>/dev/null || { echo "Failed to determine release"; exit 1; } | |
| 54 | 94 | [ -z "$VERSION_CODENAME" ] && echo "VERSION_CODENAME not found" && exit 1 | |
| 55 | 95 | ||
| @@ -70,102 +110,490 @@ EOF | |||
| 70 | 110 | fi | |
| 71 | 111 | } | |
| 72 | 112 | ||
| 73 | - | # Добавляем репозиторий MEPHI | |
| 74 | - | add_mephi_repository | |
| 75 | - | ||
| 76 | - | # Обновление и апгрейд | |
| 77 | - | apt -y upgrade | |
| 78 | - | ||
| 79 | - | # Установка пакетов (включая sudo) | |
| 80 | - | PACKAGES=( | |
| 81 | - | pv nano curl wget sudo lsb-release iptables | |
| 82 | - | unzip pigz zstd | |
| 83 | - | ncdu gdu | |
| 84 | - | screen tmux lynx | |
| 85 | - | htop btop iftop mtr ioping | |
| 86 | - | git jq yq pwgen | |
| 87 | - | bind9-dnsutils net-tools ssh-audit | |
| 88 | - | cloud-guest-utils qemu-guest-agent | |
| 89 | - | console-setup | |
| 90 | - | ) | |
| 113 | + | # Обновление системы | |
| 114 | + | update_system() { | |
| 115 | + | echo -e "${ANSI_GREEN}=== Обновление системы ===${ANSI_RESET}" | |
| 116 | + | apt update | |
| 117 | + | apt -y upgrade | |
| 118 | + | } | |
| 91 | 119 | ||
| 92 | - | echo -e "${ANSI_GREEN}Installing packages...${ANSI_RESET}" | |
| 93 | - | apt-get update | |
| 94 | - | apt-get install -y "${PACKAGES[@]}" | |
| 120 | + | # Установка пакетов | |
| 121 | + | install_packages() { | |
| 122 | + | local packages=( | |
| 123 | + | pv nano curl wget sudo lsb-release iptables | |
| 124 | + | unzip pigz zstd | |
| 125 | + | ncdu gdu | |
| 126 | + | screen tmux lynx | |
| 127 | + | htop btop iftop mtr ioping | |
| 128 | + | git jq yq pwgen | |
| 129 | + | bind9-dnsutils net-tools ssh-audit | |
| 130 | + | cloud-guest-utils qemu-guest-agent | |
| 131 | + | console-setup | |
| 132 | + | ) | |
| 133 | + | ||
| 134 | + | echo -e "${ANSI_GREEN}Installing packages...${ANSI_RESET}" | |
| 135 | + | apt-get update | |
| 136 | + | apt-get install -y "${packages[@]}" | |
| 137 | + | } | |
| 95 | 138 | ||
| 96 | 139 | # Настройка SSH | |
| 97 | - | echo -e "${ANSI_GREEN}Allowing SSH root login${ANSI_RESET}" | |
| 98 | - | sed -i 's/^.*PermitRootLogin.*$/PermitRootLogin yes/' /etc/ssh/sshd_config | |
| 99 | - | systemctl restart sshd | |
| 100 | - | echo -e "${ANSI_GREEN}Ok.${ANSI_RESET}" | |
| 101 | - | ||
| 102 | - | # Midnight Commander | |
| 103 | - | apt-get -y install mc | |
| 140 | + | configure_ssh() { | |
| 141 | + | echo -e "${ANSI_GREEN}Allowing SSH root login${ANSI_RESET}" | |
| 142 | + | sed -i 's/^.*PermitRootLogin.*$/PermitRootLogin yes/' /etc/ssh/sshd_config | |
| 143 | + | systemctl restart sshd | |
| 144 | + | echo -e "${ANSI_GREEN}Ok.${ANSI_RESET}" | |
| 145 | + | } | |
| 104 | 146 | ||
| 105 | 147 | # Настройка таймзоны и локали | |
| 106 | - | echo "tzdata tzdata/Areas select Europe" | debconf-set-selections | |
| 107 | - | echo "tzdata tzdata/Zones/Europe select Moscow" | debconf-set-selections | |
| 108 | - | DEBIAN_FRONTEND=noninteractive dpkg-reconfigure tzdata | |
| 148 | + | configure_locale() { | |
| 149 | + | echo "tzdata tzdata/Areas select Europe" | debconf-set-selections | |
| 150 | + | echo "tzdata tzdata/Zones/Europe select Moscow" | debconf-set-selections | |
| 151 | + | DEBIAN_FRONTEND=noninteractive dpkg-reconfigure tzdata | |
| 109 | 152 | ||
| 110 | - | cat > /etc/locale.gen << EOF | |
| 153 | + | cat > /etc/locale.gen << EOF | |
| 111 | 154 | ru_RU.UTF-8 UTF-8 | |
| 112 | 155 | en_US.UTF-8 UTF-8 | |
| 113 | 156 | EOF | |
| 114 | 157 | ||
| 115 | - | locale-gen | |
| 116 | - | update-locale LANG=en_US.UTF-8 | |
| 117 | - | locale -a | grep -E "en_US|ru_RU" | |
| 118 | - | source /etc/default/locale | |
| 158 | + | locale-gen | |
| 159 | + | update-locale LANG=en_US.UTF-8 | |
| 160 | + | locale -a | grep -E "en_US|ru_RU" | |
| 161 | + | source /etc/default/locale | |
| 119 | 162 | ||
| 120 | - | dpkg-reconfigure console-setup | |
| 121 | - | dpkg-reconfigure keyboard-configuration | |
| 163 | + | dpkg-reconfigure console-setup | |
| 164 | + | dpkg-reconfigure keyboard-configuration | |
| 165 | + | } | |
| 122 | 166 | ||
| 123 | 167 | # Настройка journald | |
| 124 | - | mkdir -p /etc/systemd/journald.conf.d | |
| 125 | - | cat > /etc/systemd/journald.conf.d/size.conf << EOF | |
| 168 | + | configure_journald() { | |
| 169 | + | mkdir -p /etc/systemd/journald.conf.d | |
| 170 | + | cat > /etc/systemd/journald.conf.d/size.conf << EOF | |
| 126 | 171 | [Journal] | |
| 127 | 172 | SystemMaxUse=1G | |
| 128 | 173 | SystemMaxFileSize=50M | |
| 129 | 174 | MaxLevelStore=warning | |
| 130 | 175 | EOF | |
| 131 | 176 | ||
| 132 | - | systemctl restart systemd-journald | |
| 177 | + | systemctl restart systemd-journald | |
| 178 | + | } | |
| 133 | 179 | ||
| 134 | 180 | # Создание пользователя | |
| 135 | - | useradd -m "$NEW_USER" && echo "$NEW_USER:$USER_PASS" | chpasswd && passwd -e "$NEW_USER" | |
| 136 | - | usermod -aG sudo "$NEW_USER" | |
| 181 | + | create_user() { | |
| 182 | + | local username=$1 | |
| 183 | + | local password=$2 | |
| 137 | 184 | ||
| 138 | - | # Настройка .Xauthority | |
| 139 | - | touch "/home/$NEW_USER/.Xauthority" | |
| 140 | - | chown "$NEW_USER:$NEW_USER" "/home/$NEW_USER/.Xauthority" | |
| 185 | + | useradd -m "$username" && echo "$username:$password" | chpasswd && passwd -e "$username" | |
| 186 | + | usermod -aG sudo "$username" | |
| 141 | 187 | ||
| 142 | - | echo -e "${ANSI_GREEN}Пользователь $NEW_USER с паролем '${ANSI_YELLOW}$USER_PASS${ANSI_GREEN}' создан${ANSI_RESET}" | |
| 188 | + | touch "/home/$username/.Xauthority" | |
| 189 | + | chown "$username:$username" "/home/$username/.Xauthority" | |
| 190 | + | ||
| 191 | + | echo -e "${ANSI_GREEN}Пользователь $username с паролем '${ANSI_YELLOW}$password${ANSI_GREEN}' создан${ANSI_RESET}" | |
| 192 | + | } | |
| 143 | 193 | ||
| 144 | 194 | # Настройка истории для пользователя | |
| 145 | - | cat >> "/home/$NEW_USER/.bashrc" << 'EOF' | |
| 195 | + | configure_user_history() { | |
| 196 | + | local username=$1 | |
| 197 | + | cat >> "/home/$username/.bashrc" << 'EOF' | |
| 146 | 198 | export HISTSIZE=10000 | |
| 147 | 199 | export HISTFILESIZE=50000 | |
| 148 | 200 | export HISTTIMEFORMAT="%F %T " | |
| 149 | 201 | export HISTCONTROL=ignoredups:ignorespace | |
| 150 | 202 | shopt -s histappend | |
| 151 | 203 | export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" | |
| 204 | + | export TERM=xterm-256color | |
| 152 | 205 | EOF | |
| 153 | - | ||
| 154 | - | chown "$NEW_USER:$NEW_USER" "/home/$NEW_USER/.bashrc" | |
| 155 | - | ||
| 156 | - | # Удаление документации git | |
| 157 | - | rm -rf /usr/share/doc/git/RelNotes | |
| 206 | + | chown "$username:$username" "/home/$username/.bashrc" | |
| 207 | + | } | |
| 158 | 208 | ||
| 159 | 209 | # Настройка истории для root | |
| 160 | - | cat >> /root/.bashrc << 'EOF' | |
| 210 | + | configure_root_history() { | |
| 211 | + | cat >> /root/.bashrc << 'EOF' | |
| 161 | 212 | export HISTSIZE=10000 | |
| 162 | 213 | export HISTFILESIZE=50000 | |
| 163 | 214 | export HISTTIMEFORMAT="%F %T " | |
| 164 | 215 | export HISTCONTROL=ignoredups:ignorespace | |
| 165 | 216 | shopt -s histappend | |
| 166 | 217 | export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" | |
| 218 | + | export TERM=xterm-256color | |
| 219 | + | EOF | |
| 220 | + | source /root/.bashrc | |
| 221 | + | } | |
| 222 | + | ||
| 223 | + | # Очистка документации git | |
| 224 | + | clean_git_docs() { | |
| 225 | + | rm -rf /usr/share/doc/git/RelNotes | |
| 226 | + | } | |
| 227 | + | ||
| 228 | + | # Финальное сообщение | |
| 229 | + | finish_setup() { | |
| 230 | + | echo -e "${ANSI_GREEN}=== Настройка завершена ===${ANSI_RESET}" | |
| 231 | + | } | |
| 232 | + | ||
| 233 | + | # Запись конфигурационного файла | |
| 234 | + | write_config_file() { | |
| 235 | + | local file_path=$1 | |
| 236 | + | local create_backup=${2:-true} # создать резервную копию? (по умолчанию true) | |
| 237 | + | ||
| 238 | + | echo -e "${ANSI_GREEN}=== Запись конфигурации в $file_path ===${ANSI_RESET}" | |
| 239 | + | ||
| 240 | + | # Создание резервной копии | |
| 241 | + | if [ "$create_backup" = true ] && [ -f "$file_path" ]; then | |
| 242 | + | local backup_path="${file_path}.backup.$(date +%Y%m%d_%H%M%S)" | |
| 243 | + | cp "$file_path" "$backup_path" | |
| 244 | + | echo -e "${ANSI_YELLOW}Создана резервная копия: $backup_path${ANSI_RESET}" | |
| 245 | + | fi | |
| 246 | + | ||
| 247 | + | # Создание директории, если её нет | |
| 248 | + | local dir_path=$(dirname "$file_path") | |
| 249 | + | if [ ! -d "$dir_path" ]; then | |
| 250 | + | mkdir -p "$dir_path" | |
| 251 | + | echo -e "${ANSI_YELLOW}Создана директория: $dir_path${ANSI_RESET}" | |
| 252 | + | fi | |
| 253 | + | ||
| 254 | + | # Чтение содержимого из heredoc | |
| 255 | + | cat > "$file_path" | |
| 256 | + | ||
| 257 | + | # Установка правильных прав (опционально) | |
| 258 | + | chmod 644 "$file_path" | |
| 259 | + | ||
| 260 | + | echo -e "${ANSI_GREEN}Файл успешно записан: $file_path${ANSI_RESET}" | |
| 261 | + | } | |
| 262 | + | ||
| 263 | + | make_motd_generator() { | |
| 264 | + | write_config_file "/etc/update-motd.d/99-mymotd-generator" false << 'EOF' | |
| 265 | + | #!/bin/bash | |
| 266 | + | ||
| 267 | + | # Text Color Variables http://misc.flogisoft.com/bash/tip_colors_and_formatting | |
| 268 | + | tcLtG="\033[00;37m" # LIGHT GRAY | |
| 269 | + | tcDkG="\033[01;30m" # DARK GRAY | |
| 270 | + | tcLtR="\033[01;31m" # LIGHT RED | |
| 271 | + | tcLtGRN="\033[01;32m" # LIGHT GREEN | |
| 272 | + | tcLtBL="\033[01;34m" # LIGHT BLUE | |
| 273 | + | tcLtP="\033[01;35m" # LIGHT PURPLE | |
| 274 | + | tcLtC="\033[01;36m" # LIGHT CYAN | |
| 275 | + | tcW="\033[01;37m" # WHITE | |
| 276 | + | tcRESET="\033[0m" | |
| 277 | + | tcORANGE="\033[38;5;209m" | |
| 278 | + | ||
| 279 | + | # Time of day | |
| 280 | + | HOUR=$(date +"%H") | |
| 281 | + | if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="morning" | |
| 282 | + | elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="afternoon" | |
| 283 | + | else TIME="evening" | |
| 284 | + | fi | |
| 285 | + | ||
| 286 | + | # System uptime | |
| 287 | + | uptime=`cat /proc/uptime | cut -f1 -d.` | |
| 288 | + | upDays=$((uptime/60/60/24)) | |
| 289 | + | upHours=$((uptime/60/60%24)) | |
| 290 | + | upMins=$((uptime/60%60)) | |
| 291 | + | ||
| 292 | + | # System + Memory | |
| 293 | + | MEMORY_USED=`free -b | grep Mem | awk '{print $3/$2 * 100.0}'` | |
| 294 | + | SWAP_USED=`free -b | grep Swap | awk '{print $3/$2 * 100.0}'` | |
| 295 | + | NUM_PROCS=`ps aux | wc -l` | |
| 296 | + | ||
| 297 | + | # IP первого сетевого интерфейса | |
| 298 | + | LOCAL_IP=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+' | grep -v '^127\.' | head -n 1) | |
| 299 | + | ||
| 300 | + | # Имя сервера | |
| 301 | + | HOSTNAME=$(hostname) | |
| 302 | + | ||
| 303 | + | # ОS | |
| 304 | + | OS=$(grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"') | |
| 305 | + | ||
| 306 | + | # Пользователь | |
| 307 | + | USER_NAME=$(whoami) | |
| 308 | + | [ "$USER_NAME" = "root" ] && USER_NAME="${tcLtR}${USER_NAME}${tcRESET}" | |
| 309 | + | ||
| 310 | + | # Load average | |
| 311 | + | LOADAVG=$(awk '{print $1" "$2" "$3}' /proc/loadavg) | |
| 312 | + | SYS_LOADS=`cat /proc/loadavg | awk '{print $1}'` | |
| 313 | + | ||
| 314 | + | # RAM: всего и свободно (в мегабайтах) | |
| 315 | + | RAM_TOTAL=$(free -m | awk '/Mem:/ {print $2}') | |
| 316 | + | RAM_FREE=$(free -m | awk '/Mem:/ {print $7}') | |
| 317 | + | RAM_FREE_PCT=$(( RAM_FREE * 100 / RAM_TOTAL )) | |
| 318 | + | ||
| 319 | + | # Количество CPU | |
| 320 | + | CPU_COUNT=$(nproc) | |
| 321 | + | ||
| 322 | + | # Uptime | |
| 323 | + | UPTIME=$(uptime -p) | |
| 324 | + | ||
| 325 | + | # HDD: для корневого раздела / | |
| 326 | + | DISK_TOTAL_HUMAN=$(df -h / | awk 'NR==2 {print $2}') | |
| 327 | + | DISK_FREE_HUMAN=$(df -h / | awk 'NR==2 {print $4}') | |
| 328 | + | ||
| 329 | + | # Используем df без форматирования для процентов | |
| 330 | + | DISK_TOTAL=$(df -k / | awk 'NR==2 {print $2}') | |
| 331 | + | DISK_FREE=$(df -k / | awk 'NR==2 {print $4}') | |
| 332 | + | DISK_FREE_PCT=$(( DISK_FREE * 100 / DISK_TOTAL )) | |
| 333 | + | ||
| 334 | + | echo -e "$tcDkG ===============================================================" | |
| 335 | + | echo -e $tcLtG " Good $TIME! $tcORANGE $LOCAL_IP" | |
| 336 | + | echo -e $tcDkG "===============================================================" | |
| 337 | + | echo -e $tcLtG " - Hostname :$tcW ${HOSTNAME}" | |
| 338 | + | echo -e $tcLtG " - IP Address :$tcW ${LOCAL_IP:-N/A}" | |
| 339 | + | echo -e $tcLtG " - User :$tcW ${USER_NAME}" | |
| 340 | + | echo -e $tcLtG "===============================================================" | |
| 341 | + | echo -e $tcLtG " - OS Release :$tcW ${OS}" | |
| 342 | + | echo -e $tcLtG " - Kernel : `uname -a | awk '{print $1" "$3" "$12}'`" | |
| 343 | + | echo -e $tcLtG " - Users : Currently `users | wc -w` user(s) logged on" | |
| 344 | + | echo -e $tcLtG "===============================================================" | |
| 345 | + | echo -e $tcLtG " - Server Time : `date`" | |
| 346 | + | echo -e $tcLtG " - System load : ${SYS_LOADS} / ${NUM_PROCS} processes running" | |
| 347 | + | echo -e $tcLtG " - Load average : ${LOADAVG}" | |
| 348 | + | echo -e $tcLtG " - System uptime : ${upDays} days ${upHours} hours ${upMins} minutes" | |
| 349 | + | echo -e $tcLtG "===============================================================" | |
| 350 | + | echo -e $tcLtG " - CPU : ${CPU_COUNT} CPU" | |
| 351 | + | echo -e $tcLtG " - RAM : ${RAM_TOTAL} MB, ${RAM_FREE} MB (${RAM_FREE_PCT}%) free" | |
| 352 | + | echo -e $tcLtG " - HDD : ${DISK_TOTAL_HUMAN}, ${DISK_FREE_HUMAN} (${DISK_FREE_PCT}%) free" | |
| 353 | + | echo -e $tcLtG " - Swap used % : ${SWAP_USED}" | |
| 354 | + | echo -e $tcDkG "===============================================================" | |
| 355 | + | echo -e $tcRESET "" | |
| 356 | + | EOF | |
| 357 | + | ||
| 358 | + | write_config_file "/etc/issue" false << 'EOF' | |
| 359 | + | Debian GNU/Linux 12 \n \l | |
| 360 | + | ||
| 361 | + | Local IP: не доступен | |
| 167 | 362 | EOF | |
| 363 | + | } | |
| 364 | + | ||
| 365 | + | install_midnight_commanger() { | |
| 366 | + | apt-get -y install mc | |
| 367 | + | ||
| 368 | + | write_config_file "/root/.config/mc/ini" false <<< 'EOF' | |
| 369 | + | [Midnight-Commander] | |
| 370 | + | verbose=true | |
| 371 | + | shell_patterns=true | |
| 372 | + | auto_save_setup=true | |
| 373 | + | preallocate_space=false | |
| 374 | + | auto_menu=false | |
| 375 | + | use_internal_view=true | |
| 376 | + | use_internal_edit=false | |
| 377 | + | clear_before_exec=true | |
| 378 | + | confirm_delete=true | |
| 379 | + | confirm_overwrite=true | |
| 380 | + | confirm_execute=false | |
| 381 | + | confirm_history_cleanup=true | |
| 382 | + | confirm_exit=false | |
| 383 | + | confirm_directory_hotlist_delete=false | |
| 384 | + | confirm_view_dir=false | |
| 385 | + | safe_delete=false | |
| 386 | + | safe_overwrite=false | |
| 387 | + | use_8th_bit_as_meta=false | |
| 388 | + | mouse_move_pages_viewer=true | |
| 389 | + | mouse_close_dialog=false | |
| 390 | + | fast_refresh=false | |
| 391 | + | drop_menus=false | |
| 392 | + | wrap_mode=true | |
| 393 | + | old_esc_mode=true | |
| 394 | + | cd_symlinks=true | |
| 395 | + | show_all_if_ambiguous=false | |
| 396 | + | use_file_to_guess_type=true | |
| 397 | + | alternate_plus_minus=false | |
| 398 | + | only_leading_plus_minus=true | |
| 399 | + | show_output_starts_shell=false | |
| 400 | + | xtree_mode=false | |
| 401 | + | file_op_compute_totals=true | |
| 402 | + | classic_progressbar=true | |
| 403 | + | use_netrc=true | |
| 404 | + | ftpfs_always_use_proxy=false | |
| 405 | + | ftpfs_use_passive_connections=true | |
| 406 | + | ftpfs_use_passive_connections_over_proxy=false | |
| 407 | + | ftpfs_use_unix_list_options=true | |
| 408 | + | ftpfs_first_cd_then_ls=true | |
| 409 | + | ignore_ftp_chattr_errors=true | |
| 410 | + | editor_fill_tabs_with_spaces=false | |
| 411 | + | editor_return_does_auto_indent=false | |
| 412 | + | editor_backspace_through_tabs=false | |
| 413 | + | editor_fake_half_tabs=true | |
| 414 | + | editor_option_save_position=true | |
| 415 | + | editor_option_auto_para_formatting=false | |
| 416 | + | editor_option_typewriter_wrap=false | |
| 417 | + | editor_edit_confirm_save=true | |
| 418 | + | editor_syntax_highlighting=true | |
| 419 | + | editor_persistent_selections=true | |
| 420 | + | editor_drop_selection_on_copy=true | |
| 421 | + | editor_cursor_beyond_eol=false | |
| 422 | + | editor_cursor_after_inserted_block=false | |
| 423 | + | editor_visible_tabs=true | |
| 424 | + | editor_visible_spaces=true | |
| 425 | + | editor_line_state=false | |
| 426 | + | editor_simple_statusbar=false | |
| 427 | + | editor_check_new_line=false | |
| 428 | + | editor_show_right_margin=false | |
| 429 | + | editor_group_undo=true | |
| 430 | + | editor_state_full_filename=true | |
| 431 | + | editor_ask_filename_before_edit=false | |
| 432 | + | nice_rotating_dash=true | |
| 433 | + | shadows=true | |
| 434 | + | mcview_remember_file_position=false | |
| 435 | + | auto_fill_mkdir_name=true | |
| 436 | + | copymove_persistent_attr=true | |
| 437 | + | pause_after_run=1 | |
| 438 | + | mouse_repeat_rate=100 | |
| 439 | + | double_click_speed=250 | |
| 440 | + | old_esc_mode_timeout=1000000 | |
| 441 | + | max_dirt_limit=10 | |
| 442 | + | num_history_items_recorded=60 | |
| 443 | + | vfs_timeout=60 | |
| 444 | + | ftpfs_directory_timeout=900 | |
| 445 | + | ftpfs_retry_seconds=30 | |
| 446 | + | fish_directory_timeout=900 | |
| 447 | + | editor_tab_spacing=8 | |
| 448 | + | editor_word_wrap_line_length=72 | |
| 449 | + | editor_option_save_mode=0 | |
| 450 | + | editor_backup_extension=~ | |
| 451 | + | editor_filesize_threshold=64M | |
| 452 | + | editor_stop_format_chars=-+*\\,.;:&> | |
| 453 | + | mcview_eof= | |
| 454 | + | skin=modarcon16 | |
| 455 | + | ||
| 456 | + | filepos_max_saved_entries=1024 | |
| 457 | + | ||
| 458 | + | [Layout] | |
| 459 | + | output_lines=0 | |
| 460 | + | left_panel_size=86 | |
| 461 | + | top_panel_size=0 | |
| 462 | + | message_visible=false | |
| 463 | + | keybar_visible=true | |
| 464 | + | xterm_title=true | |
| 465 | + | command_prompt=true | |
| 466 | + | menubar_visible=true | |
| 467 | + | free_space=true | |
| 468 | + | horizontal_split=false | |
| 469 | + | vertical_equal=true | |
| 470 | + | horizontal_equal=true | |
| 471 | + | ||
| 472 | + | [Misc] | |
| 473 | + | timeformat_recent=%b %e %H:%M | |
| 474 | + | timeformat_old=%b %e %Y | |
| 475 | + | ftp_proxy_host=gate | |
| 476 | + | ftpfs_password=anonymous@ | |
| 477 | + | display_codepage=UTF-8 | |
| 478 | + | source_codepage=Other_8_bit | |
| 479 | + | autodetect_codeset= | |
| 480 | + | spell_language=en | |
| 481 | + | clipboard_store= | |
| 482 | + | clipboard_paste= | |
| 483 | + | ||
| 484 | + | [Colors] | |
| 485 | + | base_color= | |
| 486 | + | linux= | |
| 487 | + | color_terminals= | |
| 488 | + | ||
| 489 | + | xterm-256color= | |
| 490 | + | ||
| 491 | + | [Panels] | |
| 492 | + | show_mini_info=true | |
| 493 | + | kilobyte_si=false | |
| 494 | + | mix_all_files=false | |
| 495 | + | show_backups=true | |
| 496 | + | show_dot_files=true | |
| 497 | + | fast_reload=false | |
| 498 | + | fast_reload_msg_shown=false | |
| 499 | + | mark_moves_down=true | |
| 500 | + | reverse_files_only=true | |
| 501 | + | auto_save_setup_panels=false | |
| 502 | + | navigate_with_arrows=false | |
| 503 | + | panel_scroll_pages=true | |
| 504 | + | panel_scroll_center=false | |
| 505 | + | mouse_move_pages=true | |
| 506 | + | filetype_mode=true | |
| 507 | + | permission_mode=false | |
| 508 | + | torben_fj_mode=false | |
| 509 | + | quick_search_mode=2 | |
| 510 | + | select_flags=6 | |
| 511 | + | ||
| 512 | + | [Panelize] | |
| 513 | + | Find *.orig after patching=find . -name \\*.orig -print | |
| 514 | + | Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm /011 \\) -o \\( -perm -02000 -a -perm /01 \\) \\) -print | |
| 515 | + | Find rejects after patching=find . -name \\*.rej -print | |
| 516 | + | Modified git files=git ls-files --modified | |
| 517 | + | ||
| 518 | + | EOF | |
| 519 | + | ||
| 520 | + | write_config_file "/root/.config/mc/panels.ini" false <<< 'EOF' | |
| 521 | + | [New Left Panel] | |
| 522 | + | display=listing | |
| 523 | + | reverse=false | |
| 524 | + | case_sensitive=true | |
| 525 | + | exec_first=false | |
| 526 | + | sort_order=name | |
| 527 | + | list_mode=full | |
| 528 | + | brief_cols=2 | |
| 529 | + | user_format=half type name | size | owner | |
| 530 | + | user_status0=half type name | size | perm | |
| 531 | + | user_status1=half type name | size | perm | |
| 532 | + | user_status2=half type name | size | perm | |
| 533 | + | user_status3=half type name | size | perm | |
| 534 | + | user_mini_status=false | |
| 535 | + | filter_flags=7 | |
| 536 | + | list_format=user | |
| 537 | + | ||
| 538 | + | [New Right Panel] | |
| 539 | + | display=listing | |
| 540 | + | reverse=false | |
| 541 | + | case_sensitive=true | |
| 542 | + | exec_first=false | |
| 543 | + | sort_order=name | |
| 544 | + | list_mode=full | |
| 545 | + | brief_cols=2 | |
| 546 | + | user_format=half type name | size | owner | |
| 547 | + | user_status0=half type name | size | perm | |
| 548 | + | user_status1=half type name | size | perm | |
| 549 | + | user_status2=half type name | size | perm | |
| 550 | + | user_status3=half type name | size | perm | |
| 551 | + | user_mini_status=false | |
| 552 | + | filter_flags=7 | |
| 553 | + | list_format=user | |
| 554 | + | ||
| 555 | + | [Dirs] | |
| 556 | + | current_is_left=false | |
| 557 | + | other_dir=/root | |
| 558 | + | EOF | |
| 559 | + | ||
| 560 | + | ||
| 561 | + | ||
| 562 | + | ||
| 563 | + | } | |
| 564 | + | ||
| 565 | + | # ==================== ОСНОВНАЯ ЛОГИКА ==================== | |
| 566 | + | ||
| 567 | + | main() { | |
| 568 | + | check_root | |
| 569 | + | ||
| 570 | + | echo -e "${ANSI_GREEN}=== Настройка системы ===${ANSI_RESET}" | |
| 571 | + | ||
| 572 | + | # Сбор данных | |
| 573 | + | NEW_HOSTNAME=$(ask_hostname) | |
| 574 | + | NEW_USER=$(ask_username) | |
| 575 | + | USER_PASS=$(ask_password "$NEW_USER") | |
| 576 | + | ask_proxy | |
| 168 | 577 | ||
| 169 | - | source /root/.bashrc | |
| 578 | + | # Выполнение настроек | |
| 579 | + | set_hostname "$NEW_HOSTNAME" | |
| 580 | + | add_mephi_repository | |
| 581 | + | update_system | |
| 582 | + | install_packages | |
| 583 | + | configure_ssh | |
| 584 | + | configure_locale | |
| 585 | + | configure_journald | |
| 586 | + | create_user "$NEW_USER" "$USER_PASS" | |
| 587 | + | configure_user_history "$NEW_USER" | |
| 588 | + | configure_root_history | |
| 589 | + | clean_git_docs | |
| 590 | + | ||
| 591 | + | make_motd_generator | |
| 592 | + | ||
| 593 | + | install_midnight_commanger | |
| 594 | + | ||
| 595 | + | finish_setup | |
| 596 | + | } | |
| 170 | 597 | ||
| 171 | - | echo -e "${ANSI_GREEN}=== Настройка завершена успешно ===${ANSI_RESET}" | |
| 598 | + | # Запуск главной функции | |
| 599 | + | main "$@" | |
KarelWintersky revised this gist 23 hours ago. Go to revision
1 file changed, 171 insertions
install.sh(file created)
| @@ -0,0 +1,171 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | set -e | |
| 4 | + | ||
| 5 | + | # Цвета для вывода | |
| 6 | + | ANSI_RED='\033[0;31m' | |
| 7 | + | ANSI_GREEN='\033[0;32m' | |
| 8 | + | ANSI_YELLOW='\033[1;33m' | |
| 9 | + | ANSI_RESET='\033[0m' | |
| 10 | + | ||
| 11 | + | # Проверка, что скрипт запущен от root | |
| 12 | + | if [ "$EUID" -ne 0 ]; then | |
| 13 | + | echo -e "${ANSI_RED}Ошибка: скрипт должен запускаться от root${ANSI_RESET}" | |
| 14 | + | exit 1 | |
| 15 | + | fi | |
| 16 | + | ||
| 17 | + | echo -e "${ANSI_GREEN}=== Настройка системы ===${ANSI_RESET}" | |
| 18 | + | ||
| 19 | + | # Запрос имени хоста | |
| 20 | + | echo -e "${ANSI_YELLOW}Введите новое имя хоста:${ANSI_RESET}" | |
| 21 | + | read -p "Hostname: " NEW_HOSTNAME | |
| 22 | + | if [ -z "$NEW_HOSTNAME" ]; then | |
| 23 | + | echo -e "${ANSI_RED}Имя хоста не может быть пустым.${ANSI_RESET}" | |
| 24 | + | exit 1 | |
| 25 | + | fi | |
| 26 | + | ||
| 27 | + | # Запрос имени пользователя | |
| 28 | + | echo -e "${ANSI_YELLOW}Введите имя нового пользователя:${ANSI_RESET}" | |
| 29 | + | read -p "Username: " NEW_USER | |
| 30 | + | if [ -z "$NEW_USER" ]; then | |
| 31 | + | echo -e "${ANSI_RED}Имя пользователя не может быть пустым.${ANSI_RESET}" | |
| 32 | + | exit 1 | |
| 33 | + | fi | |
| 34 | + | ||
| 35 | + | # Запрос пароля для нового пользователя | |
| 36 | + | echo -e "${ANSI_YELLOW}Введите пароль для пользователя $NEW_USER:${ANSI_RESET}" | |
| 37 | + | read -s -p "Password: " USER_PASS | |
| 38 | + | echo | |
| 39 | + | if [ -z "$USER_PASS" ]; then | |
| 40 | + | echo -e "${ANSI_RED}Пароль не может быть пустым.${ANSI_RESET}" | |
| 41 | + | exit 1 | |
| 42 | + | fi | |
| 43 | + | ||
| 44 | + | echo -e "\n${ANSI_GREEN}=== Установка имени хоста: $NEW_HOSTNAME ===${ANSI_RESET}" | |
| 45 | + | hostnamectl set-hostname "$NEW_HOSTNAME" | |
| 46 | + | # Обновление /etc/hosts | |
| 47 | + | sed -i "s/^127.0.1.1.*/127.0.1.1\t$NEW_HOSTNAME/" /etc/hosts | |
| 48 | + | echo -e "${ANSI_GREEN}Имя хоста установлено.${ANSI_RESET}" | |
| 49 | + | ||
| 50 | + | # Функция добавления репозитория MEPHI | |
| 51 | + | add_mephi_repository() { | |
| 52 | + | # Определение версии Debian | |
| 53 | + | . /etc/os-release 2>/dev/null || { echo "Failed to determine release"; exit 1; } | |
| 54 | + | [ -z "$VERSION_CODENAME" ] && echo "VERSION_CODENAME not found" && exit 1 | |
| 55 | + | ||
| 56 | + | local conf_file="/etc/apt/sources.list.d/debian_mephi.list" | |
| 57 | + | ||
| 58 | + | if grep -qs "mirror.mephi.ru.*$VERSION_CODENAME" "$conf_file" 2>/dev/null; then | |
| 59 | + | echo -e "Repository for $VERSION_CODENAME already exists in $conf_file" | |
| 60 | + | else | |
| 61 | + | echo -e "Adding repository for Debian $VERSION_CODENAME" | |
| 62 | + | cat >> "$conf_file" << EOF | |
| 63 | + | ||
| 64 | + | # Added $(date '+%Y-%m-%d') | |
| 65 | + | deb http://mirror.mephi.ru/debian/ $VERSION_CODENAME main non-free-firmware | |
| 66 | + | deb-src http://mirror.mephi.ru/debian/ $VERSION_CODENAME main non-free-firmware | |
| 67 | + | EOF | |
| 68 | + | echo "Repository added, updating package list..." | |
| 69 | + | apt update | |
| 70 | + | fi | |
| 71 | + | } | |
| 72 | + | ||
| 73 | + | # Добавляем репозиторий MEPHI | |
| 74 | + | add_mephi_repository | |
| 75 | + | ||
| 76 | + | # Обновление и апгрейд | |
| 77 | + | apt -y upgrade | |
| 78 | + | ||
| 79 | + | # Установка пакетов (включая sudo) | |
| 80 | + | PACKAGES=( | |
| 81 | + | pv nano curl wget sudo lsb-release iptables | |
| 82 | + | unzip pigz zstd | |
| 83 | + | ncdu gdu | |
| 84 | + | screen tmux lynx | |
| 85 | + | htop btop iftop mtr ioping | |
| 86 | + | git jq yq pwgen | |
| 87 | + | bind9-dnsutils net-tools ssh-audit | |
| 88 | + | cloud-guest-utils qemu-guest-agent | |
| 89 | + | console-setup | |
| 90 | + | ) | |
| 91 | + | ||
| 92 | + | echo -e "${ANSI_GREEN}Installing packages...${ANSI_RESET}" | |
| 93 | + | apt-get update | |
| 94 | + | apt-get install -y "${PACKAGES[@]}" | |
| 95 | + | ||
| 96 | + | # Настройка SSH | |
| 97 | + | echo -e "${ANSI_GREEN}Allowing SSH root login${ANSI_RESET}" | |
| 98 | + | sed -i 's/^.*PermitRootLogin.*$/PermitRootLogin yes/' /etc/ssh/sshd_config | |
| 99 | + | systemctl restart sshd | |
| 100 | + | echo -e "${ANSI_GREEN}Ok.${ANSI_RESET}" | |
| 101 | + | ||
| 102 | + | # Midnight Commander | |
| 103 | + | apt-get -y install mc | |
| 104 | + | ||
| 105 | + | # Настройка таймзоны и локали | |
| 106 | + | echo "tzdata tzdata/Areas select Europe" | debconf-set-selections | |
| 107 | + | echo "tzdata tzdata/Zones/Europe select Moscow" | debconf-set-selections | |
| 108 | + | DEBIAN_FRONTEND=noninteractive dpkg-reconfigure tzdata | |
| 109 | + | ||
| 110 | + | cat > /etc/locale.gen << EOF | |
| 111 | + | ru_RU.UTF-8 UTF-8 | |
| 112 | + | en_US.UTF-8 UTF-8 | |
| 113 | + | EOF | |
| 114 | + | ||
| 115 | + | locale-gen | |
| 116 | + | update-locale LANG=en_US.UTF-8 | |
| 117 | + | locale -a | grep -E "en_US|ru_RU" | |
| 118 | + | source /etc/default/locale | |
| 119 | + | ||
| 120 | + | dpkg-reconfigure console-setup | |
| 121 | + | dpkg-reconfigure keyboard-configuration | |
| 122 | + | ||
| 123 | + | # Настройка journald | |
| 124 | + | mkdir -p /etc/systemd/journald.conf.d | |
| 125 | + | cat > /etc/systemd/journald.conf.d/size.conf << EOF | |
| 126 | + | [Journal] | |
| 127 | + | SystemMaxUse=1G | |
| 128 | + | SystemMaxFileSize=50M | |
| 129 | + | MaxLevelStore=warning | |
| 130 | + | EOF | |
| 131 | + | ||
| 132 | + | systemctl restart systemd-journald | |
| 133 | + | ||
| 134 | + | # Создание пользователя | |
| 135 | + | useradd -m "$NEW_USER" && echo "$NEW_USER:$USER_PASS" | chpasswd && passwd -e "$NEW_USER" | |
| 136 | + | usermod -aG sudo "$NEW_USER" | |
| 137 | + | ||
| 138 | + | # Настройка .Xauthority | |
| 139 | + | touch "/home/$NEW_USER/.Xauthority" | |
| 140 | + | chown "$NEW_USER:$NEW_USER" "/home/$NEW_USER/.Xauthority" | |
| 141 | + | ||
| 142 | + | echo -e "${ANSI_GREEN}Пользователь $NEW_USER с паролем '${ANSI_YELLOW}$USER_PASS${ANSI_GREEN}' создан${ANSI_RESET}" | |
| 143 | + | ||
| 144 | + | # Настройка истории для пользователя | |
| 145 | + | cat >> "/home/$NEW_USER/.bashrc" << 'EOF' | |
| 146 | + | export HISTSIZE=10000 | |
| 147 | + | export HISTFILESIZE=50000 | |
| 148 | + | export HISTTIMEFORMAT="%F %T " | |
| 149 | + | export HISTCONTROL=ignoredups:ignorespace | |
| 150 | + | shopt -s histappend | |
| 151 | + | export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" | |
| 152 | + | EOF | |
| 153 | + | ||
| 154 | + | chown "$NEW_USER:$NEW_USER" "/home/$NEW_USER/.bashrc" | |
| 155 | + | ||
| 156 | + | # Удаление документации git | |
| 157 | + | rm -rf /usr/share/doc/git/RelNotes | |
| 158 | + | ||
| 159 | + | # Настройка истории для root | |
| 160 | + | cat >> /root/.bashrc << 'EOF' | |
| 161 | + | export HISTSIZE=10000 | |
| 162 | + | export HISTFILESIZE=50000 | |
| 163 | + | export HISTTIMEFORMAT="%F %T " | |
| 164 | + | export HISTCONTROL=ignoredups:ignorespace | |
| 165 | + | shopt -s histappend | |
| 166 | + | export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" | |
| 167 | + | EOF | |
| 168 | + | ||
| 169 | + | source /root/.bashrc | |
| 170 | + | ||
| 171 | + | echo -e "${ANSI_GREEN}=== Настройка завершена успешно ===${ANSI_RESET}" | |