Last active 21 hours ago

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}"
Newer Older