Работа над удаленным проектом с Eclipse через SSH

192

У меня есть следующие коробки:

  1. Коробка Windows с Eclipse CDT,
  2. Коробка Linux, доступная для меня только через SSH.

И компилятор, и оборудование, необходимое для сборки и запуска моего проекта, находятся только на компьютере B.

Я хотел бы работать "прозрачно" из окна Windows в этом проекте с помощью Eclipse CDT и иметь возможность создавать, запускать и отлаживать проект удаленно из среды IDE.

Как мне это настроить:

  • Здание будет работать? Какие-нибудь более простые решения, чем написание локального make-файла, который запустил бы rsyncпроект, а затем вызвать удаленный make-файл, чтобы инициировать фактическую сборку? Есть ли в Eclipse управляемая сборка такая возможность?
  • Отладка будет работать?
  • Желательно - Eclipse CDT code indexing будет работать? Нужно ли копировать все необходимые файлы заголовков с компьютера B на компьютер A и добавлять их вручную, чтобы включить путь?
Кос
источник
4
Кос, ты в конечном итоге использовал RSE? Как прошел ваш опыт?
Александр Левчук
2
Мне удалось это сделать, но: a) у CDT были некоторые проблемы с осведомленностью о виртуальной файловой системе (AFAIK это временная проблема и исчезнет, ​​когда они переписывают некоторые вещи в более новый API; возможно, они уже сделали? IDK) и б) мне пришлось свернуть мою собственную цепочку компиляции (через собственный make-файл) и в) неприятное сохранение файла раздражения заняло примерно 2-3 секунды, и это беспокоило.
Кос
1
Если бы мне сегодня снова пришлось работать удаленно, я бы, вероятно, предпринял еще одно вращение с RSE, но я мог бы посчитать более целесообразным сохранить его как локальный проект и свернуть систему пользовательской сборки, основанную, например, rsyncна упоминается.
Кос
2
И, к сожалению, мне не удалось настроить удаленную отладку или индексирование заголовков удаленных библиотек. Я сомневаюсь, что последнее можно даже сделать. Первый - я уверен, что это возможно, но у меня действительно не было необходимости копаться в этом.
Кос
Я получаю доступ к своей удаленной машине, сначала войдя в систему на сервере входа в систему, а затем войдя оттуда на мою удаленную машину. Оба имеют разные пароли. Есть ли способ работать на такой удаленной машине в Eclipse?
Арджун Дж Рао

Ответы:

219

Попробуйте удаленный системный обозреватель (RSE). Это набор плагинов, чтобы делать именно то, что вы хотите.

RSE уже может быть включен в вашу текущую установку Eclipse. Для проверки в Eclipse Indigo перейдите в « Окно» > « Открыть перспективу» > « Другие» и выберите « Удаленный системный обозреватель» в диалоговом окне « Открыть перспективу », чтобы открыть перспективу RSE.

Чтобы создать удаленный проект SSH с точки зрения RSE в Eclipse:

  1. Определите новое подключение и выберите «Только SSH» на экране «Выбор типа удаленной системы» в диалоговом окне «Новое подключение».
  2. Введите информацию о соединении, затем выберите Готово.
  3. Подключитесь к новому хосту. (Предполагается, что ключи SSH уже настроены.)
  4. После подключения разверните Sftp-файлы хоста , выберите папку и выберите « Создать удаленный проект» в контекстном меню элемента. (Подождите, пока удаленный проект создан.)

Если все сделано правильно, теперь должен быть новый удаленный проект, доступный из Project Explorer и других ракурсов затмения. При правильной настройке соединения SSH пароли могут стать дополнительной частью обычного процесса аутентификации SSH. Удаленный проект с Eclipse через SSH теперь создан.

Аарон Дигулла
источник
2
RSE все еще сложно. Лучшая идея от RSE для Eclipse - делать все через SSH-соединение, но эта функция еще не работает. Рабочая функция включает в себя некоторый сервер, который вам нужно настроить на Linux.
Ян
2
Также ребята из RSE любят получать отчеты об ошибках / улучшениях.
Аарон Дигулла
2
@Aaron - я уже пробовал это решение rsync из Makefile - которое в основном заменило бы вашу последовательность клавиш одним Ctrl + B. Проблема в том, что при таком подходе я не могу ни запустить, ни отладить из Eclipse. RSE действительно звучит как хороший инструмент с работы; @ Иоанн, можешь рассказать, что не работает? Вики RSE, кажется, перечисляет файловые системы SSH и удаленную отладку как текущую функцию ... Или я просто попробую это в этот понедельник.
Кос
3
@AaronDigulla Привет, решение классное, но я обнаружил, что при создании удаленного проекта Eclipse пытается скомпилировать его локально. Можно ли как-нибудь скомпилировать и запустить его на удаленной машине?
shaoyl85
1
Индексирование C / C ++ не работает должным образом с RSE. Индексатор жалуется на пропущенные символы. Это хорошо работает, когда проект и исходные файлы хранятся локально, но с RSE это не так. Любые идеи?
Black_Zero
12

Самый простой способ - запустить Eclipse CDT на Linux Box и использовать программное обеспечение X11-Forwarding или программное обеспечение для удаленного рабочего стола, такое как VNC.

Это, конечно, возможно только в том случае, если Eclipse присутствует на компьютере с Linux и ваше сетевое подключение к устройству достаточно быстрое.

Преимущество состоит в том, что из-за того, что все локально, у вас не будет проблем с синхронизацией, и у вас не будет никаких неловких кроссплатформенных проблем.

Если у вас нет затмения на коробке, вы можете подумать о том, чтобы поделиться своим рабочим каталогом linux через SMB (или SSHFS) и получить к нему доступ с вашего компьютера с Windows, но это потребует некоторых настроек.

Оба были бы лучше, чем иметь две копии, особенно когда это кроссплатформенный.

Lagerbaer
источник
1
Боюсь, в коробке с Linux нет даже X11. :)
Кос
2
@ Kos, вам нужен X11-сервер для работы там, где вы физически сидите - либо с Linux на виртуальной машине, либо с сервером X11 для Windows - и Eclipse для работы на сервере Linux. ssh просто позволяет туннелировать данные в сети - вы найдете сжатие + "-c blowfish", чтобы помочь вам.
Торбьерн Равн Андерсен
Просто чтобы уточнить - вы имеете в виду то, что называется «безголовым затмением» на удаленной машине? (Ну, при условии, что у него даже есть Java :)). Я искал легкое решение на стороне клиента, но некоторые настройки на удаленном компьютере тоже могли бы быть вариантом.
Кос
7
@ Kos: Нет. X11 работает так: у вас есть клиент и сервер. Сервер находится там, где подключен монитор. Это делает все рендеринг и отображение. Клиент (в данном случае Eclipse) просто отправляет команды рендеринга на сервер. Таким образом, вы должны установить X11 в Windows и запустить Eclipse на вашем Linux-компьютере. Все, что вам нужно сделать в Linux - это установить DISPLAYпеременную, чтобы Eclipse знал, где находится сервер.
Аарон Дигулла
5
Хотя сеть должна быть быстрой, и ваш сервер, или Eclipse будут работать очень медленно.
mattalxndr
6

Я сам в том же месте (или был), FWIW. Я закончил тем, что проверял общий ресурс samba на хосте Linux и редактировал этот локальный ресурс на машине Windows с помощью notepad ++, затем я компилировал его на Linux с помощью PuTTY. (Нам не разрешалось обновлять десять версий редакторов на хосте Linux, и у него не было Java, поэтому я отказался от пересылки X11)

Теперь ... Я запускаю современный Linux в виртуальной машине на своем хосте Windows, добавляю все необходимые инструменты (например, CDT) к виртуальной машине, а затем извлекаю и встраиваю в chroot-тюрьму, которая очень похожа на RTE.

Это неуклюжее решение, но я подумал, что добавлю его в микс.

timB33
источник
3

Мое решение похоже на SAMBA, за исключением использования sshfs. Смонтируйте мой удаленный сервер с помощью sshfs, откройте мой проект makefile на удаленной машине. Иди оттуда.

Кажется, я тоже могу запустить интерфейс с графическим интерфейсом для Mercurial.

Создать мой удаленный код так же просто, как: ssh address remote_make_command

Я ищу достойный способ отладки, хотя. Возможно через gdbserver?

Саманта
источник
2

У меня была такая же проблема 2 года назад, и я решил ее следующим образом:

1) Я создаю свои проекты с помощью make-файлов, не управляемых Eclipse. 2) Я использую соединение SAMBA для редактирования файлов в Eclipse. 3) Создание проекта: Eclipse вызывает «локальное» создание с помощью Make-файла, который открывает SSH-соединение с Linux. Хост. В командной строке SSH вы можете указать параметры, которые выполняются на хосте Linux. Для этого параметра я использую скрипт оболочки makeit.sh, который вызывает «реальный» make на хосте linux. Различные цели для сборки вы можете также указать с помощью параметров из локального файла makefile -> makeit.sh -> makefile на хосте Linux.

900ss
источник
Хорошо, но нельзя назвать «прозрачным» - по крайней мере, не позволяет отладку. Также может быть основан на RSync вместо Samba (это то, что я имел до того, как опубликовал свой оригинальный вопрос).
Кос
2

Я пытался, ssh -Xно это было невыносимо медленно.

Я также попробовал RSE, но он даже не поддерживал создание проекта с Makefile ( мне говорят, что это изменилось с тех пор, как я опубликовал свой ответ , но я не пробовал это)

Я читал, что NX быстрее, чем X11, но я не смог заставить его работать.

Наконец, я обнаружил, что мой сервер поддерживает X2Go (ссылка содержит инструкции по установке, если у вас нет). Теперь мне осталось только:

  • скачать и распаковать Eclipse на сервере,
  • установить X2Go на мою локальную машину ( sudo apt-get install x2goclientна Ubuntu),
  • настроить соединение (хост, автоматический вход с помощью ключа ssh, выбрать запуск Eclipse).

Все так же, как если бы я работал на локальной машине, включая сборку, отладку и индексацию кода. И нет никаких заметных лагов.

arekolek
источник
0

Этот ответ в настоящее время относится только к использованию двух компьютеров Linux [или, может быть, работает на Mac тоже? - не тестировался на Mac] (синхронизация от одного к другому), потому что я написал этот скрипт синхронизации в bash. Однако это просто оболочка git, поэтому вы можете взять его и преобразовать в кроссплатформенное решение Python или что-то еще, если хотите


Это не дает прямого ответа на вопрос ОП, но оно настолько близко, что я гарантирую, что оно ответит на вопрос многих других людей, которые попадают на эту страницу (включая мой, на самом деле, поскольку я пришел сюда прежде, чем написать свое собственное решение), поэтому я Выкладываю это здесь в любом случае.

Я бы хотел:

  1. разрабатывать код с использованием мощной IDE, такой как Eclipse, на легковесном компьютере с Linux, затем
  2. собрать этот код через ssh на другом, более мощном компьютере с Linux (из командной строки, а не из Eclipse)

Давайте назовем первый компьютер, на котором я пишу код «PC1» (персональный компьютер 1), а второй компьютер, на котором я создаю код «PC2». Мне нужен инструмент для простой синхронизации с ПК1 на ПК2. Я пытался rsync, но это было безумно медленно для больших репозиториев и занимало тонны пропускной способности и данных.

Итак, как мне это сделать? Какой рабочий процесс я должен использовать? Если у вас есть этот вопрос, вот рабочий процесс, который я решил. Я написал скрипт bash для автоматизации процесса с помощью gitавтоматической отправки изменений с ПК1 на ПК2 через удаленный репозиторий, такой как github. Пока это работает очень хорошо, и я очень доволен этим. Это намного намного быстрее, чем rsync, на мой взгляд, заслуживает большего доверия, потому что каждый ПК поддерживает функциональное git-репо и использует гораздо меньшую полосу пропускания для выполнения всей синхронизации, поэтому его легко выполнить по горячей точке мобильного телефона без использования тонны ваших данных.

Настроить:

  1. Установите скрипт на ПК1 (это решение предполагает, что ~ / bin находится в вашем $ PATH):

    git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
    cd eRCaGuy_dotfiles/useful_scripts
    mkdir -p ~/bin
    ln -s "${PWD}/sync_git_repo_from_pc1_to_pc2.sh" ~/bin/sync_git_repo_from_pc1_to_pc2
    cd ..
    cp -i .sync_git_repo ~/.sync_git_repo
  2. Теперь отредактируйте файл "~ / .sync_git_repo", который вы только что скопировали выше, и обновите его параметры в соответствии с вашим случаем. Вот параметры, которые это содержит:

    # The git repo root directory on PC2 where you are syncing your files TO; this dir must *already exist* 
    # and you must have *already `git clone`d* a copy of your git repo into it!
    # - Do NOT use variables such as `$HOME`. Be explicit instead. This is because the variable expansion will 
    #   happen on the local machine when what we need is the variable expansion from the remote machine. Being 
    #   explicit instead just avoids this problem.
    PC2_GIT_REPO_TARGET_DIR="/home/gabriel/dev/eRCaGuy_dotfiles" # explicitly type this out; don't use variables
    
    PC2_SSH_USERNAME="my_username" # explicitly type this out; don't use variables
    PC2_SSH_HOST="my_hostname"     # explicitly type this out; don't use variables
  3. Git клонировать репо, который вы хотите синхронизировать как на ПК1, так и на ПК2.

  4. Убедитесь, что все ваши ssh-ключи настроены так, чтобы иметь возможность выдвигать и извлекать данные удаленного репо с ПК1 и ПК2. Вот несколько полезных ссылок:
    1. https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
    2. https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
  5. Убедитесь, что все ваши ssh-ключи настроены на ssh с ПК1 на ПК2.
  6. Теперь cdв любой каталог в git-репо на ПК1 и запустите:

    sync_git_repo_from_pc1_to_pc2
  7. Это оно! Примерно через 30 секунд все будет магически синхронизировано с ПК1 на ПК2, и он будет выводить на печать все время, чтобы сообщить вам, что он делает, и где он это делает на вашем диске и на каком компьютере. Это также безопасно, потому что он не перезаписывает и не удаляет все, что не передано. Вместо этого он сначала поддерживает это! Читайте больше ниже о том, как это работает.

Вот процесс, который использует этот скрипт (т.е. что он на самом деле делает)

  1. С ПК1: он проверяет, есть ли какие-либо незафиксированные изменения на ПК1. Если это так, он фиксирует их на временную фиксацию в текущей ветви. Затем он принудительно выталкивает их в удаленную ветку SYNC. Затем он отменяет временную фиксацию, которую он только что сделал в локальной ветке, а затем возвращает локальное git-репо точно в прежнее состояние, размещая любые файлы, которые были ранее подготовлены во время вызова сценария. Затем он rsyncкопирует сценарий на ПК2 и sshвызывает ПК2, чтобы он запускал сценарий со специальной опцией, просто выполняющей действия на ПК2.
  2. Вот что делает PC2: он cdвходит в репозиторий и проверяет, существуют ли какие-либо локальные незафиксированные изменения. Если это так, он создает новую резервную ветвь, разветвленную из текущей ветви (имя образца: my_branch_SYNC_BAK_20200220-0028hrs-15sec<- обратите внимание, что это ГГГГММДД-ЧЧММчс - SSsec), и фиксирует любые незафиксированные изменения в этой ветви с сообщением фиксации, например DO BACKUP OF ALL НЕОГРАНИЧЕННЫЕ ИЗМЕНЕНИЯ НА ПК2 (ЦЕЛЬ ПК / СТРОИТЕЛЬНАЯ МАШИНА), Теперь он проверяет ветку SYNC, извлекая ее из удаленного хранилища, если она еще не находится на локальной машине. Затем он извлекает последние изменения в удаленном репозитории и выполняет полный сброс, чтобы заставить локальный репозиторий SYNC соответствовать удаленному репозиторию SYNC. Вы могли бы назвать это «жестким натяжением». Однако это безопасно, потому что мы уже создали резервные копии любых незафиксированных изменений, которые мы имели локально на ПК2, поэтому ничего не потеряно!
  3. Это оно! Теперь вы создали идеальную копию с ПК1 на ПК2, даже не заботясь о чистоте рабочих каталогов, так как скрипт обрабатывает все автоматические фиксации и прочее для вас! Это быстро и очень хорошо работает на огромных репозиториях. Теперь у вас есть простой механизм для использования любой IDE по вашему выбору на одной машине при сборке или тестировании на другой машине, легко, по необходимости, через точку доступа Wi-Fi со своего мобильного телефона, даже если в репозитории десятки гигабайт, и у вас есть время и ограниченные в ресурсах.

Ресурсы:

  1. Весь проект: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. Смотрите больше ссылок и ссылок в самом исходном коде этого проекта.
  2. Как сделать «жесткое извлечение», как я его называю: как заставить «git pull» перезаписать локальные файлы?

Связанный:

  1. git репозиторий синхронизируется между компьютерами при перемещении?
Габриэль Стейплс
источник