Робота над віддаленим проектом за допомогою Eclipse через SSH


192

У мене є такі поля:

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

І компілятор, і апаратне забезпечення, необхідне для складання та запуску мого проекту, є лише на машині B.

Я хотів би працювати прозоро з вікна Windows над цим проектом за допомогою Eclipse CDT і мати змогу віддалено будувати, запускати та налагоджувати проект зсередини IDE.

Як це встановити:

  • Будівля буде працювати? Будь-які простіші рішення, ніж написання локального makefile, який би rsyncпроект, а потім викликати віддалений makefile, щоб ініціювати фактичну збірку? Чи має для цього функція, керована Eclipse?
  • Налагодження спрацює?
  • Переважно - індексація коду Eclipse CDT буде працювати? Чи потрібно копіювати всі необхідні файли заголовків з машини B на машину A і додавати їх, щоб включити шлях вручну?

4
Кос, ти в кінцевому підсумку використовував RSE? Яким був ваш досвід?
Олександр Левчук

2
Мені вдалося це зробити, але: a) У CDT виникли деякі проблеми з усвідомленням віртуальної файлової системи (AFAIK це тимчасова проблема і зникне, коли вони перепишуть деякі речі на новіший API; можливо, вони вже зробили? IDK) і b) Мені довелося скручувати власну ланцюжок компіляцій (за допомогою спеціального файлу) і c) неприємне збереження файлів роздратування займало приблизно 2 ~ 3 секунди, і це було тривожно.
Кос

1
Якщо мені сьогодні доведеться знову працювати віддалено, я, мабуть, спробую ще один спін з RSE, але, можливо, мені здасться більш можливим зберегти його як локальний проект та створити власну систему складання, базуючись, наприклад, rsyncяк я згаданий.
Кос

2
І, на жаль, мені не вдалося налаштувати віддалену налагодження чи індексацію віддалених заголовків бібліотеки. Сумніваюся, що останнє можна навіть зробити. Перший - я впевнений, що це може, але мені дуже не було необхідності в цьому копатися.
Кос

Я отримую доступ до своєї віддаленої машини, спочатку ввійшовши на сервер входу, а потім увійшовши звідти на віддалений комп'ютер. Обидва мають різні паролі. Чи є спосіб працювати на такій віддаленій машині в Eclipse?
Arjun J Rao

Відповіді:


219

Спробуйте Remote System Explorer (RSE). Це набір плагінів, щоб робити саме те, що ви хочете.

RSE вже може бути включено до вашої поточної установки Eclipse. Щоб перевірити Eclipse Indigo, перейдіть у вікно > Відкрити перспективу > Інше ... та виберіть Відкритий провідник системи у діалоговому вікні " Відкрити перспективу", щоб відкрити перспективу RSE.

Щоб створити віддалений проект SSH з точки зору RSE в Eclipse:

  1. Визначте нове з'єднання та оберіть SSH Only на екрані Select Remote System Type у діалоговому вікні New Connection.
  2. Введіть інформацію про з'єднання, а потім виберіть «Готово».
  3. Підключіться до нового хоста. (Передбачається, що ключі SSH вже налаштовані.)
  4. Після підключення перейдіть до файлів Sftp хосту , виберіть папку та виберіть у контекстному меню пункту Створення віддаленого проекту . (Зачекайте, коли буде створений віддалений проект.)

Якщо все зроблено правильно, тепер має бути новий віддалений проект, доступний із Провідника проектів та інших перспектив у межах затемнення. При правильному налаштуванні з'єднання SSH паролі можна зробити необов'язковою частиною звичайного процесу автентифікації SSH. Зараз створено віддалений проект із програмою Eclipse через SSH.


2
RSE все ще хитрий. Найкраща ідея від RSE - Eclipse робити все через SSH-з'єднання, але ця функція ще не працює. Робоча функція включає деякий сервер, який потрібно встановити у вікні Linux.
Іоан

2
Також хлопці з RSE люблять отримувати звіти про помилки / покращення.
Аарон Дігулла

2
@Aaron - я вже пробував це рішення rsync раніше, з Makefile - яке в основному замінило б вашу послідовність ключів одним Ctrl + B. Проблема полягає в тому, що при такому підході я не можу ні бігти, ні налагоджувати з Eclipse. RSE справді звучить як хороший інструмент роботи; @Ioan, чи можете ви детальніше розглянути те, що не працює? Вікі 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, але це вимагало б певної настройки.

І те й інше було б краще, ніж мати дві копії, особливо коли це крос-платформа.


1
Я боюся, що у вікна Linux навіть немає X11. :)
Кос

2
@Kos, вам потрібен X11-сервер для запуску, де ви фізично сидите - або з Linux у віртуальній машині, або з X11 сервером для Windows - і Eclipse для запуску на сервері Linux. ssh просто дозволяє тунелювати мережеві дані - ви знайдете компресію + "-c".
Thorbjørn Ravn Andersen

Просто для уточнення - ви маєте на увазі те, що на віддаленій машині називається "безголове затемнення"? (Ну, за умови, що у нього навіть є Java :)). Я шукав легке рішення на стороні клієнта, але налаштування на віддаленій машині теж може бути варіантом.
Кос

7
@Kos: Ні. X11 працює так: у вас є клієнт і сервер. Сервер - це місце підключення монітора. Це робить все візуалізацію та відображення. Клієнт (Eclipse в даному випадку) просто відправляє команди рендерінгу на сервер. Таким чином, ви повинні встановити X11 в Windows і запустити Eclipse у вашому Linux вікні. Все, що вам потрібно зробити в Linux, це встановити DISPLAYзмінну, щоб Eclipse знав, де знаходиться сервер.
Аарон Дігулла

5
Мережа, однак, повинна бути швидкою, і це робить ваш сервер, або Eclipse буде працювати дуже повільно.
mattalxndr

6

Я в тому самому місці (або був), FWIW Я закінчив перевірку частки самби на хості Linux і редагував цю локально на машині Windows з блокнотом ++, потім я компілював у вікні Linux через PuTTY. (Нам не було дозволено оновлювати десять років редакторів редакторів на хості Linux, і на ньому не було Java, тому я відмовився від переадресації X11)

Тепер ... я запускаю сучасний Linux в VM на своєму хості Windows, додаю всі інструменти, які я хочу (наприклад, CDT) до VM, а потім перевіряю і будую в тюрмі chroot, що дуже нагадує RTE.

Це незграбне рішення, але я думав, що кину його на суміш.


3

Моє рішення схоже на рішення SAMBA, за винятком використання sshfs. Змонтуйте мій віддалений сервер за допомогою sshfs, відкрийте мій проект makefile на віддаленій машині. Іди звідти.

Здається, я також можу запустити інтерфейс графічного інтерфейсу, щоб переконатися в цьому.

Створення мого віддаленого коду так само просто: ssh address remote_make_command

Я шукаю гідний спосіб налагодження, хоча. Можливо, через gdbserver?


2

У мене була та сама проблема 2 роки тому, і я вирішив її наступним чином:

1) Я будую свої проекти за допомогою makefiles, не керованих eclipse 2) Я використовую з'єднання SAMBA для редагування файлів всередині Eclipse 3) Створення проекту: Eclipse викликає "локальний" make з makefile, який відкриває SSH-з'єднання з Linux Господар. У командному рядку SSH можна вказати параметри, які виконуються на хості Linux. Я використовую для цього параметра скрипт оболонки makeit.sh, який викликає "справжній" make на Linux хості. Різні цілі для побудови ви можете надати також за параметрами з локального makefile -> makeit.sh -> makefile на Linux хості.


Приємно, але не можна назвати "прозорим" - не дає можливості налагодження принаймні. Також може базуватися на RSync замість Samba (це те, що я мав до того, як я розмістив своє первісне запитання).
Кос

2

Я намагався, ssh -Xале це було нестерпно повільно.

Я також спробував RSE, але він навіть не підтримував створення проекту за допомогою Makefile ( мені кажуть, що це змінилося з моменту публікації моєї відповіді , але я цього не пробував)

Я прочитав, що NX швидше, ніж X11 переадресація, але я не зміг змусити його працювати.

Нарешті, я з’ясував, що мій сервер підтримує X2Go (у посиланні є інструкції щодо встановлення, якщо у вас немає). Тепер мені довелося лише:

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

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



0

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


Це не відповідає безпосередньо на запитання ОП, але воно настільки близько, я гарантую, що він відповість на запитання багатьох інших людей, хто приземлився на цій сторінці (в тому числі і моя, адже я прийшов сюди першим, перш ніж написати власне рішення), тож я Я все одно розміщую тут.

Я хочу:

  1. розробляйте код, використовуючи потужний IDE, як Eclipse, на легкому комп'ютері Linux, а потім
  2. побудувати цей код через ssh на іншому, більш потужному комп'ютері Linux (з командного рядка, а не зсередини Eclipse)

Давайте назвемо перший комп’ютер, де я записую код "PC1" (Персональний комп'ютер 1), і 2-й комп'ютер, де я будую код "PC2". Мені потрібен інструмент для легкої синхронізації з PC1 на PC2. Я спробував rsync, але це було шалено повільно для великих репостів і зайняло багато пропускної здатності та даних.

Отже, як це зробити? Який робочий процес я повинен використовувати? Якщо у вас є і це питання, ось такий процес роботи, який я вирішив. Я написав скрипт bash для автоматизації процесу за допомогою gitавтоматичного натискання змін з PC1 на PC2 через віддалений сховище, наприклад github. Поки що це працює дуже добре, і я дуже задоволений цим. Це набагато набагато швидше, ніж rsync, на мою думку, більш надійний, тому що кожен ПК підтримує функціональну функцію git repo та використовує набагато меншу пропускну здатність для усієї синхронізації, тому це легко зробити через гарячу точку мобільного телефону, не використовуючи тонни ваших даних.

Налаштування:

  1. Встановіть скрипт на PC1 (це рішення передбачає, що ~ / 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 клонує ваше репо, яке ви хочете синхронізувати як на PC1, так і на PC2.

  4. Переконайтесь, що ваші ssh-клавіші налаштовані для того, щоб можна було натискати та тягнути до віддаленого репо з PC1 та PC2. Ось кілька корисних посилань:
    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 з PC1 на PC2.
  6. Тепер cdу будь-який каталог в git repo на PC1 та запустіть:

    sync_git_repo_from_pc1_to_pc2
  7. Це воно! Приблизно через 30 секунд все буде магічно синхронізовано з PC1 на PC2, і він буде друкувати вихід весь час, щоб розповісти, що він робить і де це робить на своєму диску та на якому комп’ютері. Це також безпечно, оскільки він не перезаписує та не видаляє все, що не передається. Спершу це резервне копіювання! Детальніше читайте нижче про те, як це працює.

Ось процес, який використовує цей сценарій (тобто: що він насправді робить)

  1. Від PC1: він перевіряє, чи є на ПК1 будь-які незапущені зміни. Якщо це так, він зобов’язує їх тимчасово скористатися поточною гілкою. Потім це сила підштовхує їх до віддаленої гілки SYNC. Потім він розблоковує своє тимчасове зобов’язання, яке він тільки що зробив у локальній гілці, а потім повертає локальний git repo саме таким чином, як це було, налаштовуючи будь-які файли, які раніше були інсценовані під час виклику сценарію. Далі, він rsyncкопіює сценарій на PC2 і робить sshдзвінок, щоб сказати PC2 запустити сценарій із спеціальним варіантом просто робити PC2.
  2. Ось що робить PC2: він cdпереходить у репо, і перевіряє, чи існують якісь локальні неспроможні зміни. Якщо це так, він створює нову гілку резервного копіювання, роздвоєну з поточної гілки (назва зразка: my_branch_SYNC_BAK_20200220-0028hrs-15sec<- зауважте, що це YYYYMMDD-HHMMhrs - SSsec), і здійснює будь-які невідомі зміни в цій гілці з повідомленням коміті, таким як DO BACKUP OF ALL НЕЗАБАВЛЕНІ ЗМІНИ НА PC2 (ЦІЛЬНИЙ ПК / БУДІВНИЙ МАШИНА). Тепер він перевіряє гілку SYNC, витягуючи її з віддаленого сховища, якщо його вже немає на локальній машині. Потім він отримує останні зміни у віддаленому сховищі та робить жорстке скидання, щоб змусити локальне сховище SYNC відповідати віддаленому сховищу SYNC. Ви можете назвати це "важким". Однак це безпечно, тому що ми вже створили резервні копії будь-яких незавершених змін, які були на локальному рівні на ПК2, тому нічого не втрачено!
  3. Це воно! Тепер ви створили ідеальну копію з PC1 на PC2, навіть не маючи необхідності забезпечити чисті робочі каталоги, оскільки сценарій обробляв усі автоматичні фіксації та інше для вас! Це швидко і дуже добре працює на величезних сховищах. Тепер у вас є простий механізм для використання будь-якого IDE на ваш комп'ютер під час створення або тестування на іншій машині, легко, через гарячу точку Wi-Fi з вашого мобільного телефону, якщо це потрібно, навіть якщо сховище становить десятки гігабайт і ви час і обмежені ресурсами.

Ресурси:

  1. Весь проект: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. Дивіться ще багато посилань та посилань у самому вихідному коді в рамках цього проекту.
  2. Як зробити "жорстке тягнення", як я його називаю: Як змусити "git pull" перезаписати локальні файли?

Пов'язані:

  1. синхронізація сховища git між комп’ютерами під час переміщення?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.