Ostatnio aktywny 22 hours ago

Rewizja 595ce4d1f0d58656fc65e26535e365437e6db76f

install.sh Surowy
1#!/bin/bash
2
3set -e
4
5# Цвета для вывода
6ANSI_RED := $(shell tput -Txterm setaf 1)
7ANSI_GREEN := $(shell tput -Txterm setaf 2)
8ANSI_YELLOW := $(shell tput -Txterm setaf 3)
9ANSI_RESET := $(shell tput -Txterm sgr0)
10
11# ==================== ФУНКЦИИ ====================
12
13# Проверка прав root
14check_root() {
15 if [ "$EUID" -ne 0 ]; then
16 echo -e "${ANSI_RED}Ошибка: скрипт должен запускаться от root${ANSI_RESET}"
17 exit 1
18 fi
19}
20
21# Запрос имени хоста
22ask_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}
27
28# Запрос имени пользователя
29ask_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# Запрос пароля
40ask_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# Запрос настройки прокси
53ask_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
68configure_proxy() {
69 local proxy_url=$1
70 echo -e "${ANSI_GREEN}Настройка прокси для apt...${ANSI_RESET}"
71 cat > /etc/apt/apt.conf.d/02aptproxy << EOF
72Acquire::http::proxy "$proxy_url";
73Acquire::ftp::proxy "$proxy_url";
74EOF
75 echo -e "${ANSI_GREEN}Прокси настроен в /etc/apt/apt.conf.d/02aptproxy${ANSI_RESET}"
76}
77
78# Установка имени хоста
79set_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
92add_mephi_repository() {
93 . /etc/os-release 2>/dev/null || { echo "Failed to determine release"; exit 1; }
94 [ -z "$VERSION_CODENAME" ] && echo "VERSION_CODENAME not found" && exit 1
95
96 local conf_file="/etc/apt/sources.list.d/debian_mephi.list"
97
98 if grep -qs "mirror.mephi.ru.*$VERSION_CODENAME" "$conf_file" 2>/dev/null; then
99 echo -e "Repository for $VERSION_CODENAME already exists in $conf_file"
100 else
101 echo -e "Adding repository for Debian $VERSION_CODENAME"
102 cat >> "$conf_file" << EOF
103
104# Added $(date '+%Y-%m-%d')
105deb http://mirror.mephi.ru/debian/ $VERSION_CODENAME main non-free-firmware
106deb-src http://mirror.mephi.ru/debian/ $VERSION_CODENAME main non-free-firmware
107EOF
108 echo "Repository added, updating package list..."
109 apt update
110 fi
111}
112
113# Обновление системы
114update_system() {
115 echo -e "${ANSI_GREEN}=== Обновление системы ===${ANSI_RESET}"
116 apt update
117 apt -y upgrade
118}
119
120# Установка пакетов
121install_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}
138
139# Настройка SSH
140configure_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}
146
147# Настройка таймзоны и локали
148configure_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
152
153 cat > /etc/locale.gen << EOF
154ru_RU.UTF-8 UTF-8
155en_US.UTF-8 UTF-8
156EOF
157
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
162
163 dpkg-reconfigure console-setup
164 dpkg-reconfigure keyboard-configuration
165}
166
167# Настройка journald
168configure_journald() {
169 mkdir -p /etc/systemd/journald.conf.d
170 cat > /etc/systemd/journald.conf.d/size.conf << EOF
171[Journal]
172SystemMaxUse=1G
173SystemMaxFileSize=50M
174MaxLevelStore=warning
175EOF
176
177 systemctl restart systemd-journald
178}
179
180# Создание пользователя
181create_user() {
182 local username=$1
183 local password=$2
184
185 useradd -m "$username" && echo "$username:$password" | chpasswd && passwd -e "$username"
186 usermod -aG sudo "$username"
187
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}
193
194# Настройка истории для пользователя
195configure_user_history() {
196 local username=$1
197 cat >> "/home/$username/.bashrc" << 'EOF'
198export HISTSIZE=10000
199export HISTFILESIZE=50000
200export HISTTIMEFORMAT="%F %T "
201export HISTCONTROL=ignoredups:ignorespace
202shopt -s histappend
203export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
204export TERM=xterm-256color
205EOF
206 chown "$username:$username" "/home/$username/.bashrc"
207}
208
209# Настройка истории для root
210configure_root_history() {
211 cat >> /root/.bashrc << 'EOF'
212export HISTSIZE=10000
213export HISTFILESIZE=50000
214export HISTTIMEFORMAT="%F %T "
215export HISTCONTROL=ignoredups:ignorespace
216shopt -s histappend
217export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
218export TERM=xterm-256color
219EOF
220 source /root/.bashrc
221}
222
223# Очистка документации git
224clean_git_docs() {
225 rm -rf /usr/share/doc/git/RelNotes
226}
227
228# Финальное сообщение
229finish_setup() {
230 echo -e "${ANSI_GREEN}=== Настройка завершена ===${ANSI_RESET}"
231}
232
233# Запись конфигурационного файла
234write_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
263make_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 ""
356EOF
357
358 write_config_file "/etc/issue" false << 'EOF'
359 Debian GNU/Linux 12 \n \l
360
361 Local IP: не доступен
362EOF
363}
364
365install_midnight_commanger() {
366 apt-get -y install mc
367
368 write_config_file "/root/.config/mc/ini" false << 'EOF'
369[Midnight-Commander]
370verbose=true
371shell_patterns=true
372auto_save_setup=true
373preallocate_space=false
374auto_menu=false
375use_internal_view=true
376use_internal_edit=false
377clear_before_exec=true
378confirm_delete=true
379confirm_overwrite=true
380confirm_execute=false
381confirm_history_cleanup=true
382confirm_exit=false
383confirm_directory_hotlist_delete=false
384confirm_view_dir=false
385safe_delete=false
386safe_overwrite=false
387use_8th_bit_as_meta=false
388mouse_move_pages_viewer=true
389mouse_close_dialog=false
390fast_refresh=false
391drop_menus=false
392wrap_mode=true
393old_esc_mode=true
394cd_symlinks=true
395show_all_if_ambiguous=false
396use_file_to_guess_type=true
397alternate_plus_minus=false
398only_leading_plus_minus=true
399show_output_starts_shell=false
400xtree_mode=false
401file_op_compute_totals=true
402classic_progressbar=true
403use_netrc=true
404ftpfs_always_use_proxy=false
405ftpfs_use_passive_connections=true
406ftpfs_use_passive_connections_over_proxy=false
407ftpfs_use_unix_list_options=true
408ftpfs_first_cd_then_ls=true
409ignore_ftp_chattr_errors=true
410editor_fill_tabs_with_spaces=false
411editor_return_does_auto_indent=false
412editor_backspace_through_tabs=false
413editor_fake_half_tabs=true
414editor_option_save_position=true
415editor_option_auto_para_formatting=false
416editor_option_typewriter_wrap=false
417editor_edit_confirm_save=true
418editor_syntax_highlighting=true
419editor_persistent_selections=true
420editor_drop_selection_on_copy=true
421editor_cursor_beyond_eol=false
422editor_cursor_after_inserted_block=false
423editor_visible_tabs=true
424editor_visible_spaces=true
425editor_line_state=false
426editor_simple_statusbar=false
427editor_check_new_line=false
428editor_show_right_margin=false
429editor_group_undo=true
430editor_state_full_filename=true
431editor_ask_filename_before_edit=false
432nice_rotating_dash=true
433shadows=true
434mcview_remember_file_position=false
435auto_fill_mkdir_name=true
436copymove_persistent_attr=true
437pause_after_run=1
438mouse_repeat_rate=100
439double_click_speed=250
440old_esc_mode_timeout=1000000
441max_dirt_limit=10
442num_history_items_recorded=60
443vfs_timeout=60
444ftpfs_directory_timeout=900
445ftpfs_retry_seconds=30
446fish_directory_timeout=900
447editor_tab_spacing=8
448editor_word_wrap_line_length=72
449editor_option_save_mode=0
450editor_backup_extension=~
451editor_filesize_threshold=64M
452editor_stop_format_chars=-+*\\,.;:&>
453mcview_eof=
454skin=modarcon16
455
456filepos_max_saved_entries=1024
457
458[Layout]
459output_lines=0
460left_panel_size=86
461top_panel_size=0
462message_visible=false
463keybar_visible=true
464xterm_title=true
465command_prompt=true
466menubar_visible=true
467free_space=true
468horizontal_split=false
469vertical_equal=true
470horizontal_equal=true
471
472[Misc]
473timeformat_recent=%b %e %H:%M
474timeformat_old=%b %e %Y
475ftp_proxy_host=gate
476ftpfs_password=anonymous@
477display_codepage=UTF-8
478source_codepage=Other_8_bit
479autodetect_codeset=
480spell_language=en
481clipboard_store=
482clipboard_paste=
483
484[Colors]
485base_color=
486linux=
487color_terminals=
488
489xterm-256color=
490
491[Panels]
492show_mini_info=true
493kilobyte_si=false
494mix_all_files=false
495show_backups=true
496show_dot_files=true
497fast_reload=false
498fast_reload_msg_shown=false
499mark_moves_down=true
500reverse_files_only=true
501auto_save_setup_panels=false
502navigate_with_arrows=false
503panel_scroll_pages=true
504panel_scroll_center=false
505mouse_move_pages=true
506filetype_mode=true
507permission_mode=false
508torben_fj_mode=false
509quick_search_mode=2
510select_flags=6
511
512[Panelize]
513Find *.orig after patching=find . -name \\*.orig -print
514Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm /011 \\) -o \\( -perm -02000 -a -perm /01 \\) \\) -print
515Find rejects after patching=find . -name \\*.rej -print
516Modified git files=git ls-files --modified
517
518EOF
519
520 write_config_file "/root/.config/mc/panels.ini" false << 'EOF'
521[New Left Panel]
522display=listing
523reverse=false
524case_sensitive=true
525exec_first=false
526sort_order=name
527list_mode=full
528brief_cols=2
529user_format=half type name | size | owner
530user_status0=half type name | size | perm
531user_status1=half type name | size | perm
532user_status2=half type name | size | perm
533user_status3=half type name | size | perm
534user_mini_status=false
535filter_flags=7
536list_format=user
537
538[New Right Panel]
539display=listing
540reverse=false
541case_sensitive=true
542exec_first=false
543sort_order=name
544list_mode=full
545brief_cols=2
546user_format=half type name | size | owner
547user_status0=half type name | size | perm
548user_status1=half type name | size | perm
549user_status2=half type name | size | perm
550user_status3=half type name | size | perm
551user_mini_status=false
552filter_flags=7
553list_format=user
554
555[Dirs]
556current_is_left=false
557other_dir=/root
558EOF
559
560
561
562
563}
564
565# ==================== ОСНОВНАЯ ЛОГИКА ====================
566
567main() {
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
577
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}
597
598# Запуск главной функции
599main "$@"