Ultima attività 22 hours ago

Revisione 52af3aabbdce94b26d407199ccfc59aff72e0792

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