/
arch_linux
/
postinstall
Обзор
Документация
Войти
/
arch_linux
/
postinstall
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/23_ssh_management.sh
329 строк
11 KB
БАЛИЦКИЙ АЛЕКСАНДР НИКОЛАЕВИЧ
upload files
22 ноя 2025, 12:29
22 ноя 2025, 12:29
5f07267
Код
Авторство
О чём код?
#!/bin/bash # Скрипт управления SSH ключами set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функции для вывода print_info() { echo -e "${GREEN}[INFO]${NC} $1"; } print_success() { echo -e "${BLUE}[SUCCESS]${NC} $1"; } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } print_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Проверка установки SSH check_ssh_installed() { if ! command -v ssh &> /dev/null; then print_warning "SSH не установлен" read -p "Установить SSH? (y/N): " install_ssh if [[ $install_ssh =~ ^[Yy]$ ]]; then sudo pacman -S --noconfirm openssh print_success "SSH установлен" else print_error "SSH необходим для работы скрипта" return 1 fi fi return 0 } # Проверка и создание директории .ssh setup_ssh_dir() { local ssh_dir="$HOME/.ssh" if [ ! -d "$ssh_dir" ]; then print_info "Создание директории .ssh" mkdir -p "$ssh_dir" chmod 700 "$ssh_dir" print_success "Директория .ssh создана" fi if [ ! -f "$ssh_dir/authorized_keys" ]; then touch "$ssh_dir/authorized_keys" chmod 600 "$ssh_dir/authorized_keys" print_success "Файл authorized_keys создан" fi } # Генерация SSH ключа generate_ssh_key() { local ssh_dir="$HOME/.ssh" print_info "Генерация нового SSH ключа" read -p "Введите тип ключа (rsa/ed25519/ecdsa) [ed25519]: " key_type key_type=${key_type:-ed25519} read -p "Введите имя файла ключа [id_$key_type]: " key_file key_file=${key_file:-id_$key_type} read -p "Введите email для комментария: " email local comment="" if [ -n "$email" ]; then comment="-C $email" fi local key_path="$ssh_dir/$key_file" if [ -f "$key_path" ]; then print_warning "Файл $key_path уже существует" read -p "Перезаписать? (y/N): " overwrite if [[ ! $overwrite =~ ^[Yy]$ ]]; then print_info "Генерация ключа отменена" return fi fi # Генерация ключа ssh-keygen -t "$key_type" -f "$key_path" $comment # Создание конфига для автоматического использования ключа if [ ! -f "$ssh_dir/config" ]; then touch "$ssh_dir/config" chmod 600 "$ssh_dir/config" fi print_success "SSH ключ сгенерирован: $key_path" print_info "Публичный ключ:" cat "${key_path}.pub" echo "" } # Показать существующие ключи list_ssh_keys() { local ssh_dir="$HOME/.ssh" print_info "Существующие SSH ключи:" echo "" for key_file in "$ssh_dir"/*.pub; do if [ -f "$key_file" ]; then local key_name=$(basename "$key_file" .pub) local key_type=$(ssh-keygen -l -f "$ssh_dir/$key_name" | awk '{print $4}' | tr -d '()') local fingerprint=$(ssh-keygen -l -f "$ssh_dir/$key_name" | awk '{print $2}') local comment=$(awk '{print $3}' "$key_file") echo "Ключ: $key_name" echo "Тип: $key_type" echo "Отпечаток: $fingerprint" echo "Комментарий: $comment" echo "---" fi done if [ ! -f "$ssh_dir/id_rsa.pub" ] && [ ! -f "$ssh_dir/id_ed25519.pub" ] && [ ! -f "$ssh_dir/id_ecdsa.pub" ]; then print_warning "SSH ключи не найдены" fi } # Добавить ключ в authorized_keys add_to_authorized_keys() { local ssh_dir="$HOME/.ssh" print_info "Добавление ключа в authorized_keys" # Показать доступные ключи local keys=() local i=1 for key_file in "$ssh_dir"/*.pub; do if [ -f "$key_file" ]; then keys[i]="$key_file" echo "$i) $(basename $key_file)" ((i++)) fi done if [ ${#keys[@]} -eq 0 ]; then print_error "Нет доступных SSH ключей" return 1 fi read -p "Выберите ключ (1-${#keys[@]}): " key_choice if [[ $key_choice -ge 1 && $key_choice -le ${#keys[@]} ]]; then local selected_key="${keys[key_choice]}" local key_content=$(cat "$selected_key") # Проверка на дубликат if grep -q "$key_content" "$ssh_dir/authorized_keys" 2>/dev/null; then print_warning "Этот ключ уже добавлен в authorized_keys" else cat "$selected_key" >> "$ssh_dir/authorized_keys" print_success "Ключ добавлен в authorized_keys" fi else print_error "Неверный выбор" fi } # Удалить ключ из authorized_keys remove_from_authorized_keys() { local ssh_dir="$HOME/.ssh" if [ ! -s "$ssh_dir/authorized_keys" ]; then print_warning "Файл authorized_keys пуст или не существует" return fi print_info "Текущие ключи в authorized_keys:" echo "" cat -n "$ssh_dir/authorized_keys" echo "" read -p "Введите номер ключа для удаления: " line_num if [[ $line_num =~ ^[0-9]+$ ]] && [ $line_num -gt 0 ]; then sed -i "${line_num}d" "$ssh_dir/authorized_keys" print_success "Ключ удален из authorized_keys" else print_error "Неверный номер строки" fi } # Настройка SSH сервера setup_ssh_server() { print_info "Настройка SSH сервера" # Установка SSH сервера если не установлен if ! pacman -Q openssh >/dev/null 2>&1; then sudo pacman -S --noconfirm openssh fi # Включение службы sudo systemctl enable sshd sudo systemctl start sshd # Бэкап конфига sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup # Безопасная настройка SSH read -p "Разрешить аутентификацию по паролю? (y/N): " password_auth read -p "Разрешить вход root? (y/N): " root_login # Создание временного конфига cat << EOF | sudo tee /etc/ssh/sshd_config > /dev/null Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key # Аутентификация PubkeyAuthentication yes PasswordAuthentication ${password_auth:-no} ChallengeResponseAuthentication no # Безопасность PermitRootLogin ${root_login:-no} MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 # Прочие настройки X11Forwarding yes PrintMotd yes AcceptEnv LANG LC_* Subsystem sftp /usr/lib/ssh/sftp-server EOF # Перезагрузка SSH сервера sudo systemctl restart sshd print_success "SSH сервер настроен и запущен" } # Копирование ключа на удаленный сервер copy_key_to_remote() { local ssh_dir="$HOME/.ssh" print_info "Копирование SSH ключа на удаленный сервер" read -p "Введите имя пользователя на удаленном сервере: " remote_user read -p "Введите hostname/IP удаленного сервера: " remote_host # Выбор ключа для копирования local keys=() local i=1 for key_file in "$ssh_dir"/*.pub; do if [ -f "$key_file" ]; then keys[i]="$key_file" echo "$i) $(basename $key_file)" ((i++)) fi done if [ ${#keys[@]} -eq 0 ]; then print_error "Нет доступных SSH ключей" return 1 fi read -p "Выберите ключ (1-${#keys[@]}): " key_choice if [[ $key_choice -ge 1 && $key_choice -le ${#keys[@]} ]]; then local selected_key="${keys[key_choice]}" # Копирование ключа ssh-copy-id -i "$selected_key" "${remote_user}@${remote_host}" if [ $? -eq 0 ]; then print_success "Ключ успешно скопирован на $remote_host" else print_error "Ошибка при копировании ключа" fi else print_error "Неверный выбор" fi } # Главное меню SSH show_ssh_menu() { while true; do clear echo -e "${GREEN}╔═══════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ УПРАВЛЕНИЕ SSH КЛЮЧАМИ ║${NC}" echo -e "${GREEN}╚═══════════════════════════════════════════════╝${NC}" echo "" echo "1) Сгенерировать новый SSH ключ" echo "2) Показать существующие ключи" echo "3) Добавить ключ в authorized_keys" echo "4) Удалить ключ из authorized_keys" echo "5) Настроить SSH сервер" echo "6) Скопировать ключ на удаленный сервер" echo "7) Проверить подключение к SSH серверу" echo "" echo "0) Назад в главное меню" echo "" read -p "Выберите пункт меню (0-7): " choice case $choice in 1) generate_ssh_key ;; 2) list_ssh_keys ;; 3) add_to_authorized_keys ;; 4) remove_from_authorized_keys ;; 5) setup_ssh_server ;; 6) copy_key_to_remote ;; 7) read -p "Введите hostname/IP для проверки: " check_host ssh -o ConnectTimeout=5 "$check_host" "echo 'SSH подключение успешно!'" ;; 0) break ;; *) print_error "Неверный выбор. Попробуйте снова." ;; esac echo "" read -p "Нажмите Enter для продолжения..." done } # Основная функция main() { check_ssh_installed || exit 1 setup_ssh_dir show_ssh_menu } # Запуск основной функции main "$@"