Lavora su un progetto remoto con Eclipse tramite SSH


192

Ho le seguenti caselle:

  1. Una scatola di Windows con Eclipse CDT,
  2. Una scatola Linux, accessibile per me solo tramite SSH.

Sia il compilatore che l'hardware necessari per compilare ed eseguire il mio progetto sono solo sulla macchina B.

Mi piacerebbe lavorare "in modo trasparente" da una finestra di Windows su quel progetto usando Eclipse CDT ed essere in grado di costruire, eseguire ed eseguire il debug del progetto in remoto dall'IDE.

Come lo installo:

  • L'edificio funzionerà? Qualche soluzione più semplice della scrittura di un makefile locale quale sarebbe rsyncil progetto e quindi chiamare un makefile remoto per avviare la build effettiva? La build gestita di Eclipse ha una funzionalità per questo?
  • Il debug funzionerà?
  • Preferibilmente, l'indicizzazione del codice CDT di Eclipse funzionerà? Devo copiare tutti i file di intestazione necessari dalla macchina B alla macchina A e aggiungerli per includere manualmente il percorso?

4
Kos, hai finito per usare RSE? Come è stata la tua esperienza?
Aleksandr Levchuk,

2
Sono riuscito a farlo, ma: a) CDT ha avuto alcuni problemi con la conoscenza del file system virtuale (AFAIK questo è un problema temporaneo e svanirà quando riscrivono alcune cose su una API più recente; forse lo hanno già fatto? IDK) e b) ho dovuto arrotolare la mia catena di compilazione (tramite un makefile personalizzato) ec) uno spiacevole salvataggio del file di fastidio ha richiesto circa 2 ~ 3 secondi e questo è stato inquietante.
Kos,

1
Se oggi dovessi lavorare di nuovo in remoto, probabilmente farei un altro giro con RSE, ma potrei trovare più fattibile mantenerlo come progetto locale e creare un sistema di build personalizzato, basato ad esempio su rsynccome ho menzionato.
Kos,

2
E sfortunatamente, non sono riuscito a impostare il debug remoto o l'indicizzazione delle intestazioni della libreria remota. Dubito che anche quest'ultimo possa essere fatto. Il primo - sono sicuro che può, ma non avevo davvero bisogno di scavare.
Kos,

Accedo alla mia macchina remota accedendo prima a un server di accesso e quindi accedendo da lì alla mia macchina remota. Entrambi hanno password diverse. Esiste un modo per lavorare su una macchina così remota in Eclipse?
Arjun J Rao,

Risposte:


219

Prova Remote System Explorer (RSE). È un set di plug-in per fare esattamente quello che vuoi.

RSE potrebbe essere già incluso nell'installazione corrente di Eclipse. Per controllare in Eclipse Indigo vai su Finestra > Apri prospettiva > Altro ... e scegli Esplora sistema remoto dalla finestra di dialogo Apri prospettiva per aprire la prospettiva RSE.

Per creare un progetto remoto SSH dalla prospettiva RSE in Eclipse:

  1. Definire una nuova connessione e selezionare Solo SSH dalla schermata Seleziona tipo di sistema remoto nella finestra di dialogo Nuova connessione.
  2. Immettere le informazioni sulla connessione, quindi selezionare Fine.
  3. Connettiti al nuovo host. (Suppone che le chiavi SSH siano già configurate.)
  4. Una volta connesso, eseguire il drill-down nei file Sftp dell'host , scegliere una cartella e selezionare Crea progetto remoto dal menu di scelta rapida dell'elemento. (Attendi mentre viene creato il progetto remoto.)

Se eseguito correttamente, ora dovrebbe esserci un nuovo progetto remoto accessibile da Esplora progetti e altre prospettive all'interno di Eclipse. Con la connessione SSH, è possibile impostare correttamente le password come parte facoltativa del normale processo di autenticazione SSH. Viene ora creato un progetto remoto con Eclipse tramite SSH.


2
RSE è ancora difficile. L'idea migliore di RSE è che Eclipse esegua qualsiasi operazione tramite una connessione SSH, ma questa funzionalità non funziona ancora. La funzionalità di lavoro coinvolge alcuni server che è necessario configurare sulla scatola di Linux.
Ioan,

2
Anche ai ragazzi di RSE piace ricevere segnalazioni di bug / miglioramenti.
Aaron Digulla,

2
@Aaron - Ho già provato quella soluzione rsync, da un Makefile - che sostanzialmente avrebbe sostituito la sequenza di tasti con un Ctrl + B. Il problema è che con questo approccio non posso né eseguire né eseguire il debug da Eclipse. La RSE sembra davvero un buon strumento dal lavoro; @Ioan, puoi approfondire cosa non funziona? Il wiki di RSE sembra elencare i file system SSH e il debug remoto come funzionalità corrente ... O lo proverò questo lunedì.
Kos,

3
@AaronDigulla Ciao, la soluzione è interessante, ma ho scoperto che quando sto costruendo il progetto remoto, Eclipse sta cercando di compilarlo localmente. Esiste un modo per consentirne la compilazione e l'esecuzione nella macchina remota?
shaoyl85,

1
L'indicizzazione C / C ++ non funziona correttamente con RSE. L'indicizzatore si lamenta dei simboli mancanti. Funziona bene quando i file di progetto e di origine sono archiviati localmente ma con RSE non funziona. qualche idea?
Black_Zero,

12

Il modo più semplice sarebbe quello di eseguire Eclipse CDT su Linux Box e utilizzare X11-Forwarding o software desktop remoto come VNC.

Questo, ovviamente, è possibile solo quando Eclipse è presente sul box Linux e la tua connessione di rete al box è sufficientemente veloce.

Il vantaggio è che, a causa di tutto ciò che è locale, non avrai problemi di sincronizzazione e non avrai alcun problema imbarazzante multipiattaforma.

Se non hai eclissi sulla scatola, potresti pensare di condividere la tua directory di lavoro di Linux tramite SMB (o SSHFS) e accedervi dal tuo computer Windows, ma ciò richiederebbe un po 'di installazione.

Entrambi sarebbero meglio che avere due copie, soprattutto quando è multipiattaforma.


1
Temo che il box Linux non abbia nemmeno X11. :)
Kos,

2
@Kos, hai bisogno del server X11 per funzionare dove ti trovi fisicamente - con un Linux in una macchina virtuale, o un server X11 per Windows - ed Eclipse per funzionare sul server Linux. ssh consente solo il tunneling dei dati di rete - troverai compressione + "-c blowfish" per aiutare l'esperienza.
Thorbjørn Ravn Andersen,

Giusto per chiarire: ti riferisci a ciò che viene chiamato "Eclipse senza testa" sulla macchina remota? (Bene, purché abbia anche Java :)). Stavo cercando una soluzione lato client leggera, ma avere anche qualche impostazione sulla macchina remota potrebbe essere un'opzione.
Kos,

7
@Kos: No. X11 funziona in questo modo: hai un client e un server. Il server è dove è collegato il monitor. Fa tutto il rendering e la visualizzazione. Il client (Eclipse in questo caso) invia semplicemente comandi di rendering al server. Quindi devi installare X11 su Windows ed eseguire Eclipse sul tuo box Linux. Tutto ciò che devi fare su Linux è impostare la DISPLAYvariabile in modo che Eclipse sappia dove si trova il server.
Aaron Digulla,

5
Tuttavia, la rete deve essere veloce, così come il server e Eclipse funzionerà molto lentamente.
Mattalxndr,

6

Anch'io sono nello stesso posto (o lo ero), FWIW Ho finito con il check out per una condivisione samba sull'host Linux e la modifica che condivido localmente sul computer Windows con Notepad ++, quindi ho compilato sul box Linux tramite PuTTY. (Non ci era permesso aggiornare le dieci versioni y / o degli editor sull'host Linux e non aveva Java, quindi ho rinunciato all'inoltro X11)

Ora ... eseguo Linux moderno in una macchina virtuale sul mio host Windows, aggiungo tutti gli strumenti che voglio (ad esempio CDT) alla macchina virtuale e quindi eseguo il checkout e costruisco in una prigione chroot che ricorda da vicino l'RTE.

È una soluzione goffa ma ho pensato di buttarla nel mix.


3

La mia soluzione è simile a quella SAMBA ad eccezione dell'uso di sshfs. Montare il mio server remoto con sshfs, aprire il mio progetto makefile sul computer remoto. Vai da lì.

Sembra che anche io possa eseguire un frontend GUI per mercurial in questo modo.

Costruire il mio codice remoto è semplice come: indirizzo ssh remote_make_command

Sto cercando un modo decente per eseguire il debug però. Forse tramite gdbserver?


2

Ho avuto lo stesso problema 2 anni fa e l'ho risolto nel modo seguente:

1) Costruisco i miei progetti con makefile, non gestito da eclipse 2) Uso una connessione SAMBA per modificare i file all'interno di Eclipse 3) Creazione del progetto: Eclipse chiama un make "locale" con un makefile che apre una connessione SSH a Linux Ospite. Sulla riga di comando SSH è possibile fornire parametri che vengono eseguiti sull'host Linux. Per quel parametro uso uno script di shell makeit.sh che chiama il real "real" sull'host linux. I diversi target per la costruzione che puoi dare anche dai parametri dal makefile locale -> makeit.sh -> makefile sull'host linux.


Bello, ma non può essere definito "trasparente" - non consente almeno il debug. Inoltre potrebbe essere basato su RSync anziché su Samba (che è quello che avevo prima di pubblicare la mia domanda originale).
Kos,

2

Provai ssh -X ma è stato insopportabilmente lento.

Ho anche provato RSE, ma non ha nemmeno supportato la costruzione del progetto con un Makefile ( mi è stato detto che questo è cambiato da quando ho pubblicato la mia risposta , ma non l'ho provato)

Ho letto che NX è più veloce dell'inoltro X11, ma non sono riuscito a farlo funzionare.

Alla fine, ho scoperto che il mio server supporta X2Go (il link ha le istruzioni di installazione se il tuo non lo fa). Ora dovevo solo:

  • scaricare e decomprimere Eclipse sul server,
  • installa X2Go sul mio computer locale ( sudo apt-get install x2goclientsu Ubuntu),
  • configurare la connessione (host, login automatico con tasto ssh, scegliere di eseguire Eclipse).

Tutto è come se stessi lavorando su un computer locale, inclusi costruzione, debug e indicizzazione del codice. E non ci sono ritardi evidenti.



0

Questa risposta attualmente si applica solo all'utilizzo di due computer Linux [o forse funziona anche su Mac? - non testato su Mac] (sincronizzato da uno all'altro) perché ho scritto questo script di sincronizzazione in bash. gitTuttavia, è semplicemente un wrapper , quindi sentiti libero di prenderlo e convertirlo in una soluzione Python multipiattaforma o qualcosa del genere, se lo desideri


Questo non risponde direttamente alla domanda del PO, ma è così vicino che garantisco che risponderà alla domanda di molte altre persone che atterrano su questa pagina (la mia inclusa, in realtà, come sono venuta qui prima scrivere la mia soluzione), quindi io lo sto postando qui comunque.

Voglio:

  1. quindi sviluppare codice usando un potente IDE come Eclipse su un leggero computer Linux
  2. crea quel codice tramite ssh su un computer Linux diverso e più potente (dalla riga di comando, NON dall'interno di Eclipse)

Chiamiamo il primo computer in cui scrivo il codice "PC1" (Personal Computer 1) e il secondo computer in cui creo il codice "PC2". Ho bisogno di uno strumento per sincronizzare facilmente da PC1 a PC2. Ci ho provato rsync, ma è stato follemente lento per grandi repository e ha impiegato tonnellate di larghezza di banda e dati.

Quindi, come posso farlo? Quale flusso di lavoro dovrei usare? Se anche tu hai questa domanda, ecco il flusso di lavoro che ho deciso. Ho scritto uno script bash per automatizzare il processo usando gitper inviare automaticamente le modifiche da PC1 a PC2 tramite un repository remoto, come github. Finora funziona molto bene e ne sono molto contento. È molto più veloce di rsync, secondo me più affidabile perché ogni PC mantiene un repository git funzionale e utilizza molta meno larghezza di banda per eseguire l'intera sincronizzazione, quindi è facilmente eseguibile su un hot spot per telefono cellulare senza utilizzare tonnellate di dati.

Impostare:

  1. Installa lo script su PC1 (questa soluzione presuppone che ~ / bin sia nel tuo $ 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. Ora modifica il file "~ / .sync_git_repo" che hai appena copiato sopra e aggiorna i suoi parametri per adattarli al tuo caso. Ecco i parametri che contiene:

    # 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 clona il tuo repository che desideri sincronizzare su PC1 e PC2.

  4. Assicurati che i tuoi tasti ssh siano tutti configurati per poter spingere e tirare al repository remoto sia da PC1 che da PC2. Ecco alcuni link utili:
    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. Assicurarsi che i tasti ssh siano tutti impostati su ssh da PC1 a PC2.
  6. Ora cdin qualsiasi directory all'interno del repository git su PC1, ed esegui:

    sync_git_repo_from_pc1_to_pc2
  7. Questo è tutto! Circa 30 secondi dopo, tutto verrà sincronizzato magicamente da PC1 a PC2 e verrà stampato l'output tutto il tempo per dirti cosa sta facendo e dove lo sta facendo sul tuo disco e su quale computer. È anche sicuro, perché non sovrascrive o elimina tutto ciò che è non confermato. Al contrario, viene eseguito il backup prima! Leggi di seguito di seguito per come funziona.

Ecco il processo utilizzato da questo script (ovvero: cosa sta effettivamente facendo)

  1. Da PC1: controlla se ci sono modifiche non confermate su PC1. In tal caso, li esegue un commit temporaneo sul ramo corrente. Quindi forza li spinge verso un ramo SYNC remoto. Quindi annulla il commit temporaneo che ha appena fatto sul ramo locale, quindi riporta il repository git locale esattamente com'era mettendo in scena tutti i file che erano stati messi in scena in precedenza al momento in cui hai chiamato lo script. Successivamente, è una rsynccopia dello script su PC2 e fa unssh chiamata per dire a PC2 di eseguire lo script con un'opzione speciale per fare solo cose PC2.
  2. Ecco cosa fa PC2: è cdnel repository e verifica se esistono modifiche locali non confermate. In tal caso, crea un nuovo ramo di backup escluso dal ramo corrente (nome campione: my_branch_SYNC_BAK_20200220-0028hrs-15sec<- nota che è AAAAMMGG-HHMMhrs - SSsec) e apporta eventuali modifiche non impegnate a quel ramo con un messaggio di commit come DO BACKUP OF ALL MODIFICHE SENZA COMMENTI SU PC2 (TARGET PC / MACCHINA DA COSTRUZIONE) , escluso dal ramo Ora, verifica il ramo SYNC, estraendolo dal repository remoto se non è già sul computer locale. Quindi, recupera il le ultime modifiche al repository remoto ed esegue un hard reset per forzare il repository SYNC locale in modo che corrisponda al repository SYNC remoto. È possibile chiamarlo "hard pull". È sicuro, tuttavia, poiché abbiamo già eseguito il backup di eventuali modifiche non confermate che abbiamo avuto localmente su PC2, quindi nulla è perso!
  3. Questo è tutto! Ora hai prodotto una copia perfetta da PC1 a PC2 senza nemmeno dover garantire directory di lavoro pulite, poiché lo script ha gestito tutto il commit automatico e tutto il resto per te! È veloce e funziona molto bene su enormi repository. Ora hai un semplice meccanismo per utilizzare qualsiasi IDE di tua scelta su una macchina mentre costruisci o collaudi su un'altra macchina, facilmente, su un hot spot wifi dal tuo cellulare, se necessario, anche se il repository è dozzine di gigabyte e sei in tempo e limitato dalle risorse.

risorse:

  1. L'intero progetto: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. Vedi tonnellate di più collegamenti e riferimenti nel codice sorgente stesso all'interno di questo progetto.
  2. Come fare un "hard pull", come lo chiamo io: come forzo "git pull" per sovrascrivere i file locali?

Relazionato:

  1. git repository sync tra computer, quando ti muovi?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.