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. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

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

×