SSH Manager

SSH Manager

SSH Manager е прост и ефективен инструмент за управление на SSH връзки в Linux системи. Той предлага графичен интерфейс с икона в системната лента, който ви позволява да се свързвате с конфигурираните хостове в ~/.ssh/config, както и да редактирате конфигурацията си директно от менюто.

Функционалности

  • SSH връзки в едно кликване: Менюто показва всички конфигурирани SSH хостове и ви позволява да се свържете с тях чрез терминал.
  • Опресняване на списъка с хостове: Можете лесно да обновите списъка с наличните хостове.
  • Редактиране на конфигурацията: От менюто можете да отворите SSH конфигурационния файл за редактиране.
  • Изход: Има опция за затваряне на приложението от менюто.

Изисквания

  • Python 3
  • GTK 3
  • AppIndicator3
  • Пакети за работа с SSH (например, OpenSSH)

Инсталация

  1. Инсталирайте зависимостите:За да използвате SSH Manager, трябва да инсталирате следните библиотеки, ако не са налични на вашата система:
sudo apt update
sudo apt install python3-gi gir1.2-appindicator3-0.1

  1. Изтеглете скрипта:Изтеглете и запишете скрипта в директорията по ваше желание, например:
mkdir -p /home/fedia/.local/share/share/ssh-manager/ssh-manager.py
cd /home/fedia/.local/share/share/ssh-manager
nano ssh-manager.py

Не забравяйте да смените fedia с вашето име!

Копирайте и поставете съдържанието на скрипта в ssh-manager.py.

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, GLib, Gio, GdkPixbuf, AppIndicator3
import os
import re
import random
import subprocess
import threading

class SSHManager:
    def __init__(self):
        self.app_dir = os.path.expanduser("~/.local/share/ssh-manager")
        self.indicator = AppIndicator3.Indicator.new(
            "ssh-manager",
            os.path.join(self.app_dir, "ssh-manager.svg"),
            AppIndicator3.IndicatorCategory.APPLICATION_STATUS
        )
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
        self.indicator.set_title("SSH Manager")
        
        # Създаваме менюто
        self.menu = Gtk.Menu()
        self.indicator.set_menu(self.menu)
        
        # Добавяме елементи към менюто
        self.add_menu_items()
        
        # Задаваме таймер за периодично обновяване на списъка
        GLib.timeout_add_seconds(60, self.refresh_connections)
        
    def add_menu_items(self):
        # Изчистваме текущото меню
        for child in self.menu.get_children():
            self.menu.remove(child)
        
        # Добавяме бутон за опресняване
        refresh_item = Gtk.MenuItem(label="Опресни списъка")
        refresh_item.connect('activate', self.on_refresh_clicked)
        self.menu.append(refresh_item)
        
        # Добавяме разделител
        self.menu.append(Gtk.SeparatorMenuItem())
        
        # Зареждаме SSH връзките
        self.load_ssh_connections()
        
        # Добавяме разделител и опции за конфигуриране
        self.menu.append(Gtk.SeparatorMenuItem())
        
        # Опция за редактиране на SSH конфигурация
        edit_config_item = Gtk.MenuItem(label="Редактирай SSH Config")
        edit_config_item.connect('activate', self.on_edit_config_clicked)
        self.menu.append(edit_config_item)
        
        # Опция за изход от приложението
        quit_item = Gtk.MenuItem(label="Изход")
        quit_item.connect('activate', Gtk.main_quit)
        self.menu.append(quit_item)
        
        # Показваме всички елементи
        self.menu.show_all()
    
    def load_ssh_connections(self):
        # Зареждаме връзките от основния SSH конфигурационен файл
        home_dir = os.path.expanduser("~")
        main_config_file = os.path.join(home_dir, ".ssh/config")
        
        if os.path.exists(main_config_file):
            hosts = self.get_hosts_from_file(main_config_file)
            if hosts:
                self.add_connection_submenu("Основни връзки", hosts)
        
        # Зареждаме връзките от допълнителните конфигурационни файлове
        conf_dir = os.path.join(home_dir, ".ssh/conf.d")
        if os.path.exists(conf_dir) and os.path.isdir(conf_dir):
            for filename in sorted(os.listdir(conf_dir)):
                if filename.endswith(".conf") or os.path.isfile(os.path.join(conf_dir, filename)):
                    file_path = os.path.join(conf_dir, filename)
                    category_name = os.path.splitext(filename)[0]
                    hosts = self.get_hosts_from_file(file_path)
                    if hosts:
                        self.add_connection_submenu(category_name, hosts)
    
    def get_hosts_from_file(self, file_path):
        hosts = []
        try:
            with open(file_path, 'r') as f:
                content = f.read()
                # Търсим редовете започващи с "Host "
                matches = re.findall(r'Host\s+([^\s\n]+)', content)
                for host in matches:
                    # Изключваме хостове с wildcard символи (* ?)
                    if '*' not in host and '?' not in host:
                        hosts.append(host)
        except Exception as e:
            print(f"Грешка при четене на {file_path}: {e}")
        return hosts
    
    def add_connection_submenu(self, category, hosts):
        submenu = Gtk.Menu()
        submenu_item = Gtk.MenuItem(label=category)
        submenu_item.set_submenu(submenu)
        
        for host in hosts:
            item = Gtk.MenuItem(label=host)
            # Задаваме случаен цвят
            color = self.get_random_color()
            item.get_child().set_markup(f'<span color="{color}"><b>{host}</b></span>')
            item.connect('activate', self.on_host_clicked, host)
            submenu.append(item)
        
        self.menu.append(submenu_item)
    
    def get_random_color(self):
        """Генерира случаен шестнадесетичен цвят"""
        letters = '0123456789ABCDEF'
        color = '#'
        for i in range(6):
            color += random.choice(letters)
        return color
    
    def on_host_clicked(self, widget, host):
        """Обработка на избор на хост - свързване чрез SSH"""
        def run_ssh_connection():
            try:
                subprocess.run(["xterm", "-e", f"ssh {host}"])
            except Exception as e:
                print(f"Грешка при свързване с {host}: {e}")
        
        # Стартираме в отделна нишка, за да не блокира GUI-то
        thread = threading.Thread(target=run_ssh_connection)
        thread.daemon = True
        thread.start()
    
    def on_refresh_clicked(self, widget):
        """Обновява списъка с връзки"""
        self.refresh_connections()
    
    def on_edit_config_clicked(self, widget):
        """Отваря SSH конфигурационния файл за редактиране"""
        config_file = os.path.expanduser("~/.ssh/config")
        try:
            # Опитваме да определим текстовия редактор
            editor = os.environ.get('EDITOR', 'xdg-open')
            subprocess.Popen([editor, config_file])
        except Exception as e:
            print(f"Грешка при отваряне на конфигурационния файл: {e}")
    
    def refresh_connections(self):
        """Опреснява списъка с връзки периодично"""
        self.add_menu_items()
        return True  # За да продължи таймера

def main():
    ssh_manager = SSHManager()
    Gtk.main()

if __name__ == "__main__":
    main()

2. Настройте правата за изпълнение:

Дайте права за изпълнение на скрипта:

chmod +x ~/.local/share/ssh-manager/ssh-manager.py

Добавяне към Стартови приложения в Linux Mint

  1. Отворете "Автоматично стартирани програми":
    • Можете да намерите "Автоматично стартирани програми" в менюто "Start"
SSH Manager

  1. Добавете ново приложение:
    • Кликнете на Add (Добави) и въведете следната информация:
      • Име: SSH Manager
      • Команда: python3 /home/fedia/.local/share/share/ssh-manager/ssh-manager.py
      • Коментар: Стартирайте SSH Manager при стартиране на системата.
  2. Не забравяйте да смените fedia с вашето име!
  3. Запазете промените и рестартирайте системата или се логнете отново, за да стартира автоматично.
SSH Manager

📖 Прочетете още: Монтиране на отдалечена директория чрез SSH в Ubuntu

Използване

След стартиране на скрипта ще видите икона в системната лента на вашия работен плот. Кликнете върху иконата, за да видите наличните SSH хостове, да ги обновите, да редактирате конфигурацията или да затворите приложението.

Меню

  • 🔌 SSH Manager – заглавие на приложението.
  • 🔄 Опресни списъка – обновява списъка с конфигурираните хостове.
  • 💻 [Име на хост] – стартира SSH връзка с даден хост.
  • ✏️ Редактирай SSH Config – отваря конфигурационния файл за редактиране.
  • ⏻ Изход – затваря приложението.

Проблеми и отстраняване на грешки

  • Няма SSH хостове в менюто: Уверете се, че файлът ~/.ssh/config съществува и съдържа конфигурирани хостове в правилен формат.
  • Не се стартира SSH връзка: Проверете дали имате инсталиран OpenSSH и работещ SSH клиент на вашата система.

Лиценз

Този проект е с отворен код и може да бъде използван и разпространяван съгласно условията на MIT лиценз.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: