Arbeiten Sie mit Eclipse über SSH an einem Remote-Projekt

192

Ich habe folgende Boxen:

  1. Eine Windows-Box mit Eclipse CDT,
  2. Eine Linux-Box, auf die ich nur über SSH zugreifen kann.

Sowohl der Compiler als auch die Hardware, die zum Erstellen und Ausführen meines Projekts erforderlich sind, befinden sich nur auf Computer B.

Ich möchte mit Eclipse CDT "transparent" von einer Windows-Box aus an diesem Projekt arbeiten und das Projekt remote in der IDE erstellen, ausführen und debuggen können.

Wie richte ich das ein:

  • Das Gebäude wird funktionieren? Gibt es einfachere Lösungen als das Schreiben eines lokalen Makefiles, das rsyncdas Projekt und dann ein Remote-Makefile aufrufen würde , um den eigentlichen Build zu initiieren? Hat Eclipse Managed Build eine Funktion dafür?
  • Das Debuggen wird funktionieren?
  • Vorzugsweise - funktioniert die Indizierung des Eclipse CDT-Codes? Muss ich alle erforderlichen Header-Dateien von Maschine B auf Maschine A kopieren und sie hinzufügen, um den Pfad manuell einzuschließen?
Kos
quelle
4
Kos, haben Sie am Ende RSE verwendet? Wie war deine Erfahrung?
Aleksandr Levchuk
2
Ich habe es geschafft, aber: a) CDT hatte einige Probleme mit der Kenntnis des virtuellen Dateisystems (AFAIK ist ein vorübergehendes Problem und verschwindet, wenn sie einige Dinge in eine neuere API umschreiben; vielleicht haben sie es bereits getan? IDK) und b) Ich musste meine eigene Kompilierungskette (über ein benutzerdefiniertes Makefile) zusammenrollen und c) das Speichern einer unangenehmen Stördatei dauerte etwa 2 bis 3 Sekunden, was störend war.
Kos
1
Wenn ich heute wieder remote arbeiten müsste, würde ich wahrscheinlich einen weiteren Versuch mit RSE machen, aber ich könnte es praktikabler finden, es als lokales Projekt beizubehalten und ein benutzerdefiniertes Build-System zu erstellen, basierend auf z. B. rsyncwie ich erwähnt.
Kos
2
Und leider habe ich es nicht geschafft, das Remote-Debugging oder die Indizierung von Remote-Bibliotheks-Headern einzurichten. Ich bezweifle, dass Letzteres überhaupt möglich ist. Ersteres - ich bin mir sicher, dass es möglich ist, aber ich hatte nicht wirklich das Bedürfnis, mich damit zu beschäftigen.
Kos
Ich greife auf meinen Remotecomputer zu, indem ich mich zuerst bei einem Anmeldeserver und dann von dort bei meinem Remotecomputer anmelde. Beide haben unterschiedliche Passwörter. Gibt es eine Möglichkeit, in Eclipse an einem solchen Remote-Computer zu arbeiten?
Arjun J Rao

Antworten:

217

Probieren Sie den Remote System Explorer (RSE) aus. Es ist eine Reihe von Plug-Ins, die genau das tun, was Sie wollen.

RSE ist möglicherweise bereits in Ihrer aktuellen Eclipse-Installation enthalten. Um Eclipse Indigo einzuchecken, gehen Sie zu Fenster > Perspektive öffnen > Andere ... und wählen Sie im Dialogfeld Perspektive öffnen die Option Remote System Explorer , um die RSE-Perspektive zu öffnen.

So erstellen Sie ein SSH-Remote-Projekt aus der RSE-Perspektive in Eclipse:

  1. Definieren Sie eine neue Verbindung und wählen Sie im Bildschirm "Remote-Systemtyp auswählen" im Dialogfeld "Neue Verbindung" die Option "Nur SSH".
  2. Geben Sie die Verbindungsinformationen ein und wählen Sie Fertig stellen.
  3. Stellen Sie eine Verbindung zum neuen Host her. (Angenommen, die SSH-Schlüssel sind bereits eingerichtet.)
  4. Sobald die Verbindung hergestellt ist, führen Sie einen Drilldown in die Sftp-Dateien des Hosts durch , wählen Sie einen Ordner aus und wählen Sie im Kontextmenü des Elements die Option Remoteprojekt erstellen . (Warten Sie, bis das Remote-Projekt erstellt wurde.)

Bei korrekter Ausführung sollte jetzt ein neues Remote-Projekt vorhanden sein, auf das über den Projektexplorer und andere Perspektiven in Eclipse zugegriffen werden kann. Wenn die SSH-Verbindung korrekt eingerichtet ist, können Kennwörter als optionaler Bestandteil des normalen SSH-Authentifizierungsprozesses verwendet werden. Ein Remote-Projekt mit Eclipse über SSH wird jetzt erstellt.

Aaron Digulla
quelle
2
RSE ist immer noch schwierig. Die beste Idee von RSE ist, dass Eclipse alles über eine SSH-Verbindung erledigt, aber diese Funktion funktioniert noch nicht. Die Arbeitsfunktion umfasst einen Server, den Sie auf der Linux-Box einrichten müssen.
Ioan
2
Auch die RSE-Leute möchten Fehler- / Verbesserungsberichte erhalten.
Aaron Digulla
2
@Aaron - Ich habe diese rsync-Lösung bereits aus einem Makefile ausprobiert, die im Grunde Ihre Tastenfolge durch eine Strg + B ersetzen würde. Das Problem ist, dass ich mit diesem Ansatz Eclipse weder ausführen noch debuggen kann. Die RSE klingt in der Tat nach einem guten Werkzeug aus dem Job; @Ioan, kannst du näher erläutern, was nicht funktioniert? Das RSE-Wiki scheint SSH-Dateisysteme und Remote-Debugging als aktuelle Funktion aufzulisten ... Oder ich probiere es einfach diesen Montag aus.
Kos
3
@AaronDigulla Hallo, die Lösung ist cool, aber ich habe festgestellt, dass Eclipse beim Erstellen des Remote-Projekts versucht, es lokal zu kompilieren. Gibt es überhaupt eine Möglichkeit, es auf dem Remotecomputer kompilieren und ausführen zu lassen?
Shaoyl85
1
Die C / C ++ - Indizierung funktioniert mit RSE nicht ordnungsgemäß. Indexer beschwert sich über fehlende Symbole. Es funktioniert gut, wenn die Projekt- und Quelldateien lokal gespeichert sind, bei RSE jedoch nicht. irgendwelche Ideen?
Black_Zero
12

Am einfachsten wäre es, Eclipse CDT auf der Linux-Box auszuführen und entweder X11-Forwarding oder Remotedesktopsoftware wie VNC zu verwenden.

Dies ist natürlich nur möglich, wenn Eclipse auf der Linux-Box vorhanden ist und Ihre Netzwerkverbindung zur Box ausreichend schnell ist.

Der Vorteil ist, dass Sie, da alles lokal ist, keine Synchronisierungsprobleme haben und keine unangenehmen plattformübergreifenden Probleme auftreten.

Wenn Sie keine Eclipse auf der Box haben, können Sie Ihr Linux-Arbeitsverzeichnis über SMB (oder SSHFS) freigeben und von Ihrem Windows-Computer aus darauf zugreifen. Dies würde jedoch einige Einstellungen erfordern.

Beides wäre besser als zwei Kopien, besonders wenn es plattformübergreifend ist.

Lagerbaer
quelle
1
Ich fürchte, die Linux-Box hat nicht einmal X11. :)
Kos
2
@Kos, Sie müssen den X11-Server dort ausführen, wo Sie physisch sitzen - entweder mit einem Linux in einer virtuellen Maschine oder einem X11-Server für Windows - und Eclipse, um auf dem Linux-Server ausgeführt zu werden. ssh ermöglicht nur das Tunneln der Netzwerkdaten - Sie finden Komprimierung + "-c Blowfish", um die Erfahrung zu verbessern.
Thorbjørn Ravn Andersen
Nur zur Verdeutlichung - beziehen Sie sich auf das, was auf dem Remote-Computer als "kopflose Eclipse" bezeichnet wird? (Nun, vorausgesetzt es hat sogar Java :)). Ich suchte nach einer leichten clientseitigen Lösung, aber ein Setup auf dem Remote-Computer könnte auch eine Option sein.
Kos
7
@ Kos: Nein. X11 funktioniert folgendermaßen: Sie haben einen Client und einen Server. Auf dem Server ist der Monitor angeschlossen. Es übernimmt das gesamte Rendern und Anzeigen. Der Client (in diesem Fall Eclipse) sendet nur Rendering-Befehle an den Server. Sie müssen also X11 unter Windows installieren und Eclipse auf Ihrer Linux-Box ausführen. Unter Linux müssen Sie lediglich die DISPLAYVariable festlegen , damit Eclipse weiß, wo sich der Server befindet.
Aaron Digulla
5
Das Netzwerk muss jedoch schnell sein, ebenso wie Ihr Server und / oder Eclipse.
Mattalxndr
6

Ich bin selbst an der gleichen Stelle (oder war es), FWIW Ich habe schließlich eine Samba-Freigabe auf dem Linux-Host ausgecheckt und diese Freigabe lokal auf dem Windows-Computer mit Notepad ++ bearbeitet und dann über PuTTY auf der Linux-Box kompiliert. (Wir durften die zehnjährigen Versionen der Editoren auf dem Linux-Host nicht aktualisieren und es gab kein Java, daher habe ich die X11-Weiterleitung aufgegeben.)

Jetzt ... Ich führe modernes Linux in einer VM auf meinem Windows-Host aus, füge der VM alle gewünschten Tools (z. B. CDT) hinzu und checke dann ein Chroot-Gefängnis aus, das der RTE sehr ähnlich ist.

Es ist eine klobige Lösung, aber ich dachte, ich würde sie in die Mischung einfließen lassen.

timB33
quelle
3

Meine Lösung ähnelt der von SAMBA, außer dass sshfs verwendet wird. Hängen Sie meinen Remote-Server mit sshfs ein und öffnen Sie mein Makefile-Projekt auf dem Remote-Computer. Geh von dort aus.

Es scheint, dass ich auf diese Weise auch ein GUI-Frontend für mercurial ausführen kann.

Das Erstellen meines Remote-Codes ist so einfach wie: ssh-Adresse remote_make_command

Ich bin auf der Suche nach einem anständigen Weg zum Debuggen. Möglicherweise über gdbserver?

Samantha
quelle
2

Ich hatte vor 2 Jahren das gleiche Problem und habe es folgendermaßen gelöst:

1) Ich erstelle meine Projekte mit Makefiles, die nicht von Eclipse verwaltet werden. 2) Ich verwende eine SAMBA-Verbindung, um die Dateien in Eclipse zu bearbeiten. 3) Erstellen des Projekts: Eclipse ruft ein "lokales" Make mit einem Makefile auf, das eine SSH-Verbindung zum Linux öffnet Gastgeber. In der SSH-Befehlszeile können Sie Parameter angeben, die auf dem Linux-Host ausgeführt werden. Ich verwende für diesen Parameter ein makeit.sh-Shell-Skript, das das "echte" make auf dem Linux-Host aufruft. Die verschiedenen Ziele zum Erstellen können Sie auch durch Parameter aus dem lokalen Makefile -> makeit.sh -> makefile auf dem Linux-Host angeben.

900ss
quelle
Schön, kann aber nicht als "transparent" bezeichnet werden - erlaubt zumindest kein Debuggen. Könnte auch auf RSync anstelle von Samba basieren (was ich hatte, bevor ich meine ursprüngliche Frage gestellt habe).
Kos
2

Ich habe es versucht, ssh -Xaber es war unerträglich langsam.

Ich habe auch RSE ausprobiert, aber es hat nicht einmal das Erstellen des Projekts mit einem Makefile unterstützt ( mir wurde gesagt, dass sich dies geändert hat, seit ich meine Antwort gepostet habe , aber ich habe das nicht ausprobiert).

Ich habe gelesen, dass NX schneller ist als die X11-Weiterleitung, aber ich konnte es nicht zum Laufen bringen.

Schließlich fand ich heraus, dass mein Server X2Go unterstützt (der Link enthält Installationsanweisungen, falls dies bei Ihnen nicht der Fall ist). Jetzt musste ich nur noch:

  • Eclipse auf den Server herunterladen und entpacken,
  • Installieren Sie X2Go auf meinem lokalen Computer ( sudo apt-get install x2goclientunter Ubuntu).
  • Konfigurieren Sie die Verbindung (Host, automatische Anmeldung mit SSH-Schlüssel, Eclipse ausführen).

Alles ist so, als würde ich auf einem lokalen Computer arbeiten, einschließlich Erstellen, Debuggen und Code-Indizierung. Und es gibt keine merklichen Verzögerungen.

Arekolek
quelle
0

Diese Antwort gilt derzeit nur für die Verwendung von zwei Linux-Computern [oder funktioniert sie möglicherweise auch auf einem Mac? - auf einem Mac nicht getestet] (Synchronisierung von einem zum anderen), da ich dieses Synchronisierungsskript in bash geschrieben habe. Es ist jedoch nur ein Wrapper. gitNehmen Sie es also und konvertieren Sie es in eine plattformübergreifende Python-Lösung oder etwas anderes, wenn Sie dies wünschen


Dies beantwortet die Frage des OP nicht direkt, aber es ist so nah, dass ich garantiere, dass es die Frage vieler anderer Leute beantworten wird, die auf dieser Seite landen (meine eingeschlossen, da ich zuerst hierher gekommen bin, bevor ich meine eigene Lösung geschrieben habe), also ich poste es trotzdem hier.

Ich will:

  1. Entwickeln Sie dann Code mit einer leistungsstarken IDE wie Eclipse auf einem leichten Linux-Computer
  2. Erstellen Sie diesen Code über ssh auf einem anderen, leistungsstärkeren Linux-Computer (über die Befehlszeile, NICHT innerhalb von Eclipse).

Nennen wir den ersten Computer, auf dem ich den Code "PC1" schreibe (Personal Computer 1), und den zweiten Computer, auf dem ich den Code "PC2" erstelle. Ich benötige ein Tool, um einfach von PC1 zu PC2 zu synchronisieren. Ich habe es versucht rsync, aber es war wahnsinnig langsam für große Repos und nahm Tonnen von Bandbreite und Daten.

Also, wie mache ich das? Welchen Workflow soll ich verwenden? Wenn Sie auch diese Frage haben, finden Sie hier den Workflow, für den ich mich entschieden habe. Ich habe ein Bash-Skript geschrieben, um den Prozess gitzu automatisieren, indem Änderungen automatisch von PC1 auf PC2 über ein Remote-Repository wie Github übertragen werden. Bisher funktioniert es sehr gut und ich bin sehr zufrieden damit. Es ist weitaus weitaus schneller als rsync, meiner Meinung nach vertrauenswürdiger, da jeder PC ein funktionierendes Git-Repo unterhält und für die gesamte Synchronisierung weitaus weniger Bandbreite benötigt, sodass es problemlos über einen Handy-Hotspot ausgeführt werden kann, ohne Tonnen Ihrer Daten zu verwenden.

Konfiguration:

  1. Installieren Sie das Skript auf PC1 (bei dieser Lösung wird davon ausgegangen, dass sich ~ / bin in Ihrem $ PATH befindet):

    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. Bearbeiten Sie nun die oben kopierte Datei "~ / .sync_git_repo" und aktualisieren Sie die Parameter entsprechend Ihrem Fall. Hier sind die Parameter, die es enthält:

    # 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 klonen Sie Ihr Repo, das Sie auf PC1 und PC2 synchronisieren möchten.

  4. Stellen Sie sicher, dass alle SSH-Tasten so eingerichtet sind, dass Sie sowohl von PC1 als auch von PC2 aus auf das Remote-Repo drücken und ziehen können. Hier sind einige hilfreiche Links:
    1. https://help.github.com/de/github/authenticating-to-github/connecting-to-github-with-ssh
    2. https://help.github.com/de/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
  5. Stellen Sie sicher, dass alle SSH-Schlüssel von PC1 bis PC2 auf SSH eingestellt sind.
  6. Gehen Sie nun cdin ein beliebiges Verzeichnis innerhalb des Git-Repos auf PC1 und führen Sie Folgendes aus:

    sync_git_repo_from_pc1_to_pc2
  7. Das ist es! Ungefähr 30 Sekunden später wird alles auf magische Weise von PC1 zu PC2 synchronisiert, und es wird die ganze Zeit über eine Druckausgabe ausgegeben, um Ihnen mitzuteilen, was es tut und wo es es auf Ihrer Festplatte und auf welchem ​​Computer tut. Es ist auch sicher, weil es nichts überschreibt oder löscht, was nicht festgeschrieben ist. Es sichert es stattdessen zuerst! Lesen Sie weiter unten, wie das funktioniert.

Hier ist der Prozess, den dieses Skript verwendet (dh: was es tatsächlich tut)

  1. Von PC1: Überprüft, ob nicht festgeschriebene Änderungen auf PC1 vorgenommen wurden. In diesem Fall werden sie zu einem temporären Commit für den aktuellen Zweig verpflichtet. Es drückt sie dann zwangsweise zu einem entfernten SYNC-Zweig. Dann hebt es das temporäre Commit auf, das es gerade für den lokalen Zweig ausgeführt hat, und setzt das lokale Git-Repo wieder auf den genauen Stand zurück, indem es alle Dateien bereitstellt, die zum Zeitpunkt des Aufrufs des Skripts zuvor bereitgestellt wurden. Als nächstes wird eine rsyncKopie des Skripts auf PC2 übertragen und PC2 wird sshangewiesen, das Skript mit einer speziellen Option auszuführen, um nur PC2-Aufgaben auszuführen.
  2. PC2 macht Folgendes: Es befindet cdsich im Repo und prüft, ob lokale, nicht festgeschriebene Änderungen vorhanden sind. In diesem Fall wird ein neuer Sicherungszweig erstellt, der vom aktuellen Zweig getrennt ist (Beispielname: my_branch_SYNC_BAK_20200220-0028hrs-15sec<- Beachten Sie, dass dies JJJJMMTT-HHMMhrs - SSsec ist), und alle nicht festgeschriebenen Änderungen an diesem Zweig werden mit einer Festschreibungsnachricht wie DO BACKUP OF ALL festgeschrieben UNBEABSICHTIGTE ÄNDERUNGEN AN PC2 (ZIEL PC / BUILD MACHINE). Jetzt wird der SYNC-Zweig ausgecheckt und aus dem Remote-Repository abgerufen, sofern er nicht bereits auf dem lokalen Computer vorhanden ist. Anschließend werden die neuesten Änderungen im Remote-Repository abgerufen und ein Hard-Reset durchgeführt, um zu erzwingen, dass das lokale SYNC-Repository mit dem Remote-SYNC-Repository übereinstimmt. Man könnte dies einen "harten Zug" nennen. Es ist jedoch sicher, da wir bereits alle nicht festgeschriebenen Änderungen, die wir lokal auf PC2 vorgenommen haben, gesichert haben, sodass nichts verloren geht!
  3. Das ist es! Sie haben jetzt eine perfekte Kopie von PC1 nach PC2 erstellt, ohne dass Sie für saubere Arbeitsverzeichnisse sorgen müssen, da das Skript das gesamte automatische Festschreiben und alles für Sie erledigt hat! Es ist schnell und funktioniert sehr gut in riesigen Repositories. Jetzt haben Sie einen einfachen Mechanismus, mit dem Sie jede IDE Ihrer Wahl auf einem Computer verwenden können, während Sie auf einem anderen Computer bei Bedarf problemlos über einen WLAN-Hotspot Ihres Mobiltelefons bauen oder testen, selbst wenn das Repository Dutzende von Gigabyte umfasst und Sie Zeit haben und ressourcenbeschränkt.

Ressourcen:

  1. Das ganze Projekt: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. Weitere Links und Referenzen finden Sie im Quellcode selbst in diesem Projekt.
  2. Wie mache ich einen "Hard Pull", wie ich es nenne: Wie erzwinge ich "Git Pull", um lokale Dateien zu überschreiben?

Verbunden:

  1. Git Repository Synchronisierung zwischen Computern, wenn Sie sich bewegen?
Gabriel Staples
quelle