# SSH Remote Sync Плагин для IntelliJ IDEA, который позволяет работать с кодом на удалённых серверах так же удобно, как с локальным проектом. Файлы синхронизируются по SFTP, изменения отправляются на сервер при сохранении, а переключение между виртуальными машинами занимает несколько кликов. ## Возможности - **Менеджер серверов** — добавление нескольких ВМ с хостом, портом, пользователем и путём к проекту. Пароли хранятся в системном хранилище IDE (`PasswordSafe`). - **Открытие удалённого проекта** — при первом подключении плагин скачивает проект с сервера в локальную папку и открывает его в IDE. - **Автосинхронизация** — при сохранении файла (`Ctrl+S`) изменения автоматически отправляются на сервер. Создание и удаление файлов тоже синхронизируется. - **Обновление с сервера** — команда Refresh подтягивает изменения с удалённой машины, в том числе сделанные вне IDE. - **Выполнение команд** — запуск произвольной команды на привязанном сервере через SSH `exec`. - **Удалённый терминал** — встроенный терминал IDE, подключённый к серверу по SSH, с автоматическим переходом в папку проекта. - **Переключение между серверами** — быстрое переключение между проектами разных ВМ без ручного поиска файлов. ## Требования - IntelliJ IDEA Community Edition **2024.1.7** или новее - JDK **21** - SSH-доступ к удалённому серверу (аутентификация по паролю) - Bundled-плагин **Terminal** (включён в зависимости по умолчанию) ## Быстрый старт ### 1. Добавьте сервер Откройте **File → Settings → SSH Remote Project** и нажмите **+** (Add). Заполните поля: | Поле | Описание | |------|----------| | Name | Произвольное имя сервера | | Host | IP-адрес или hostname | | Port | SSH-порт (по умолчанию 22) | | User | Имя пользователя | | Password | Пароль (сохраняется в защищённом хранилище IDE) | | Remote Path | Абсолютный путь к проекту на сервере, например `/home/user/myproject` | ### 2. Откройте удалённый проект Выберите **Tools → SSH Remote Manager → Switch Remote Server** и укажите нужный сервер. Плагин скачает проект (если локальной копии ещё нет) и откроет его в IDE. ### 3. Работайте как с локальным проектом - Редактируйте файлы — при сохранении они автоматически уйдут на сервер. - Чтобы подтянуть изменения с сервера: **Tools → SSH Remote Manager → Refresh from Server**. - Чтобы открыть SSH-терминал: **Tools → SSH Remote Manager → Open Remote Terminal**. ## Локальное хранение проектов Каждый удалённый проект кэшируется локально по пути: ``` ~/ssh-remote-projects/// ``` При повторном открытии того же сервера плагин использует уже скачанную копию и синхронизирует только изменённые файлы. Служебные файлы IDE (`.idea/`, `remote.iml`) не синхронизируются с сервером. ## Меню плагина Все действия доступны в **Tools → SSH Remote Manager**: | Действие | Описание | |----------|----------| | Configure SSH Servers | Открыть настройки серверов | | Switch Remote Server | Переключиться на другой сервер / открыть его проект | | Refresh from Server | Загрузить изменения с сервера | | Run Remote Command | Выполнить команду на сервере | | Open Remote Terminal | Открыть SSH-терминал в папке проекта | ## Сборка и запуск из исходников ```bash ./gradlew runIde ``` Для сборки дистрибутива: ```bash ./gradlew buildPlugin ``` Готовый архив появится в `build/distributions/`. ## Структура проекта ``` src/main/java/com/example/plugin/ ├── SshServer.java # Модель сервера ├── SshServerManager.java # Хранение серверов и паролей ├── ProjectServerMapping.java # Связь локального проекта с сервером ├── SftpSessionManager.java # SSH/SFTP-сессии ├── SshSyncStartupActivity.java # Автосинхронизация при старте и сохранении ├── ConnectToRemoteAction.java # Скачивание и открытие проекта ├── SwitchServerAction.java # Переключение серверов ├── RefreshFromServerAction.java ├── RemoteCommandAction.java ├── OpenRemoteTerminalAction.java ├── SshTtyConnector.java # Мост SSH → встроенный терминал └── SshServerConfigurable.java # UI настроек ``` ## Ограничения - Поддерживается только аутентификация по паролю (ключи SSH пока не поддерживаются). - Проверка host key отключена (`StrictHostKeyChecking=no`) — удобно для dev-сред, но не рекомендуется для production без дополнительных мер. - Синхронизация файловая, без разрешения конфликтов: при Refresh перезаписываются файлы, которые отличаются от серверных по размеру или времени модификации. ## Лицензия См. файл [LICENSE](LICENSE).