最后活跃于 22 hours ago

修订 9f35467450fb971bcfd00b22e6af57e7da4a2ea7

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