通过SSH使用Eclipse处理远程项目


192

我有以下方框:

  1. 一个带有Eclipse CDT的Windows盒,
  2. 一个Linux机器,只能通过SSH访问。

构建和运行我的项目所需的编译器和硬件都仅在机器B上。

我想使用Eclipse CDT在该项目的Windows框中“透明地”工作,并能够从IDE内远程构建,运行和调试该项目。

我该如何设置:

  • 大楼会运转吗?有没有比编写本地makefile更简单的解决方案,rsync该方案将使项目然后调用远程makefile来启动实际构建?Eclipse托管版本是否为此提供功能?
  • 调试会起作用吗?
  • 最好-Eclipse CDT代码索引将起作用?我是否必须将所有必需的头文件从计算机B复制到计算机A并添加它们以手动包括路径?

4
Kos,您最终使用RSE吗?您的经历如何?
Aleksandr Levchuk 2011年

2
我设法做到了,但是:a)CDT在了解虚拟文件系统时遇到了一些问题(AFAIK这是一个临时性的问题,当他们将某些内容重写为更新的API时将消失;也许他们已经做到了?IDK)和b)我不得不卷起自己的编译链(通过自定义的makefile),并且c)令人不快的烦恼-文件保存花费了大约2〜3秒,这令人不安。
科斯2012年

1
如果我需要工作,今天再次远程,我可能会采取与RSE另一个旋转,但我可能会发现更可行,以保持它作为一个本地项目,并卷起定制构建系统的基础上,例如rsync,因为我已经提到。
科斯2012年

2
而且不幸的是,我还没有设置远程调试或远程库头的索引。我怀疑后者是否可以做到。前者-我很肯定,但我确实没有必要对此进行深入研究。
科斯2012年

我首先登录登录服务器,然后从那里登录到远程计算机,以访问远程计算机。两者都有不同的密码。有什么方法可以在Eclipse中的这种远程机器上工作?
Arjun J Rao

Answers:


217

尝试远程系统资源管理器(RSE)。它是一组插件,可以完全满足您的需求。

RSE可能已经包含在当前的Eclipse安装中。要检入Eclipse Indigo,请转到“ 窗口” >“ 打开透视图” >“ 其他...”,然后从“ 打开透视图”对话框中选择“ 远程系统资源管理器以打开RSE透视图。

要在Eclipse中从RSE角度创建SSH远程项目,请执行以下操作:

  1. 定义一个新连接,然后从“新建连接”对话框的“选择远程系统类型”屏幕中选择“仅SSH”。
  2. 输入连接信息,然后选择完成。
  3. 连接到新主机。(假设已经设置了SSH密钥。)
  4. 连接后,向下钻取主机的Sftp文件,选择一个文件夹,然后从项目的上下文菜单中选择“ 创建远程项目 ”。(等待创建远程项目。)

如果正确完成,现在应该可以从Project Explorer和Eclipse中的其他角度访问一个新的远程项目。通过正确的SSH连接设置,可以将密码作为常规SSH身份验证过程的可选部分。现在通过SSH使用Eclipse创建了一个远程项目。


2
RSE仍然很棘手。RSE最好的想法是让Eclipse通过SSH连接进行所有操作,但是该功能尚未起作用。工作功能涉及需要在Linux机器上设置的某些服务器。
伊万

2
RSE家伙也喜欢获取错误/增强报告。
亚伦·迪古拉

2
@Aaron-我以前在Makefile中尝试过该rsync解决方案-该方法基本上可以将您的键序列替换为一个Ctrl + B。问题在于,使用这种方法,我既无法从Eclipse运行又无法调试。RSE确实听起来像是工作中的好工具。@Ioan,您能详细说明什么不起作用吗?RSE Wiki似乎将SSH文件系统和远程调试列为当前功能...或者我将在本周一尝试一下。
科斯,2010年

3
@AaronDigulla嗨,解决方案很不错,但是我发现在构建远程项目时,Eclipse尝试在本地进行编译。无论如何,有没有要让它在远程计算机中编译和运行?
shaoyl85 2014年

1
C / C ++索引不适用于RSE。索引器抱怨缺少符号。当项目和源文件存储在本地时,它可以很好地工作,但是使用RSE则不能。有任何想法吗?
Black_Zero

12

最简单的方法是在Linux Box上运行Eclipse CDT,并使用X11-Forwarding或远程桌面软件(例如VNC)。

当然,仅当Linux盒中存在Eclipse并且与该盒的网络连接足够快时,这才可能实现。

优点是,由于所有内容都是本地的,因此不会出现同步问题,也不会遇到任何尴尬的跨平台问题。

如果包装盒上没有日食,则可以考虑通过SMB(或SSHFS)共享linux工作目录并从Windows机器上访问它,但这需要进行一些设置。

两者都比拥有两个副本更好,尤其是在跨平台的情况下。


1
恐怕linux盒子甚至没有X11。:)
Kos

2
@Kos,您需要X11服务器在实际位置上运行-在虚拟机中使用Linux,或者在Windows上使用X11服务器-并在Linux服务器上运行Eclipse。ssh只允许通过隧道传输网络数据-您将找到压缩+“ -c河豚”来帮助体验。
托尔比约恩Ravn的安徒生

只是为了澄清一下-您是指远程计算机上的“无头Eclipse”吗?(好吧,只要它甚至有Java :)。我一直在寻找一种轻量级的客户端解决方案,但是在远程计算机上进行一些设置也是一种选择。
科斯,2010年

7
@Kos:否。X11的工作原理是:您有一个客户端和一个服务器。服务器是连接监视器的位置。它完成所有渲染和显示。客户端(在本例中为Eclipse)仅将渲染命令发送到服务器。因此,您必须在Windows上安装X11并在Linux机器上运行Eclipse。在Linux上,您所需要做的就是设置DISPLAY变量,以便Eclipse知道服务器在哪里。
亚伦·迪古拉

5
但是网络需要快速,服务器也必须如此,否则Eclipse的运行速度将非常慢。
mattalxndr 2012年

6

我本人(或曾经)在同一地点,最后我在Linux主机上签出了一个samba共享,并使用notepad ++在Windows机器上本地编辑了该共享,然后我通过PuTTY在Linux机器上进行了编译。(我们不允许在Linux主机上更新十个版本的编辑器,而且它没有Java,因此我放弃了X11转发)

现在...我在Windows主机上的虚拟机中运行现代Linux,将所需的所有工具(例如CDT)添加到虚拟机,然后检出并构建与RTE非常相似的chroot监狱。

这是一个笨拙的解决方案,但我想我会把它混进去。


3

除了使用sshfs之外,我的解决方案与SAMBA类似。使用sshfs挂载我的远程服务器,在远程计算机上打开我的makefile项目。去那边

看来我也可以通过这种方式运行GUI前端。

构建我的远程代码很简单:ssh地址remote_make_command

我正在寻找一种不错的调试方式。可能通过gdbserver?


2

2年前,我遇到了同样的问题,并通过以下方式解决了该问题:

1)我使用不由eclipse管理的makefiles构建项目2)我使用SAMBA连接在Eclipse中编辑文件3)构建项目:Eclipse使用makefile调用“本地” make,从而打开与Linux的SSH连接主办。在SSH命令行上,您可以提供在Linux主机上执行的参数。我为该参数使用了makeit.sh shell脚本,该脚本在linux主机上调用了“ real” make。您还可以通过linux主机上本地makefile-> makeit.sh-> makefile中的参数来指定不同的构建目标。


很好,但是不能称为“透明”-至少不允许进行调试。也可以基于RSync而不是Samba(这是我在发布原始问题之前所拥有的)。
科斯

2

我试过了,ssh -X但是速度太慢了。

我也尝试了RSE,但它甚至不支持使用Makefile来构建项目(有人告诉我自从发布答案以来,这种情况已经改变,但是我还没有尝试过)

我读到NX比X11转发快,但我无法使它正常工作。

最终,我发现我的服务器支持X2Go(如果您的服务器不支持,该链接包含安装说明)。现在我只需要:

  • 在服务器上下载并解压缩Eclipse,
  • 在我的本地计算机(sudo apt-get install x2goclient在Ubuntu上)上安装X2Go ,
  • 配置连接(主机,使用ssh键自动登录,选择运行Eclipse)。

一切就像在本地计算机上一样,包括构建,调试和代码索引。而且没有明显的滞后。



0

这个答案目前仅适用于使用两台Linux计算机(或者也许也可以在Mac上使用?–在Mac上还没有被使用)(从另一台同步到另一台),因为我用bash编写了此同步脚本。它只是一个包装git,但是,请随意将其转换为跨平台的Python解决方案,或者您愿意的话


这并不能直接回答OP的问题,但是它是如此接近,我保证它将回答其他人进入该页面的问题(实际上,是我的,因为我是编写自己的解决方案之前来这里的,所以我将其包括在内),所以我还是在这里发布。

我想要:

  1. 在轻量级Linux计算机上使用功能强大的IDE(例如Eclipse)开发代码,然后
  2. 通过ssh在另一台功能更强大的Linux计算机上构建该代码(从命令行,而不是从Eclipse内部)

让我们称第一台我编写代码“ PC1”的计算机(个人计算机1),以及第二台我编写代码“ PC2”的计算机。我需要一个工具来轻松地从PC1同步到PC2。我试过了rsync,但是对于大型存储库来说,它是如此之慢,并占用了大量的带宽和数据。

那么,我该怎么做呢?我应该使用什么工作流程?如果您也有这个问题,这是我决定的工作流程。我编写了一个bash脚本,通过使用该脚本git通过远程存储库(例如github)自动将更改从PC1推送到PC2 来自动化该过程。到目前为止,它运行良好,我对此感到非常满意。在我看来,它远远快于rsync,更值得信赖,因为每台PC都维护一个功能齐全的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密钥均已设置为从PC1到PC2的ssh。
  6. 现在cd进入PC1上git repo内的任何目录,并运行:

    sync_git_repo_from_pc1_to_pc2
  7. 而已!大约30秒后,所有内容将从PC1神奇地同步到PC2,并且将一直打印输出,以告诉您它在磁盘上以及在哪台计算机上正在做什么,正在做什么。这也是安全的,因为它不会覆盖或删除任何未提交的内容。而是先备份它!请阅读下文,了解其工作原理。

这是该脚本使用的过程(即:它实际上在做什么)

  1. 从PC1:检查PC1上是否有未提交的更改。如果是这样,它将它们提交到当前分支上的一个临时提交。然后强行将它们推到远程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上未提交的更改(目标PC /内置机器)。现在,它签出SYNC分支,如果它不在本地计算机上,则将其从远程存储库中拉出。然后,它获取远程存储库上的最新更改,并进行硬重置以强制本地SYNC存储库与远程SYNC存储库匹配。您可能将其称为“硬拉”。这是安全的,因为我们已经备份了PC2上本地所做的所有未提交的更改,因此不会丢失任何信息!
  3. 而已!现在,您已经生成了从PC1到PC2的完美副本,而无需确保干净的工作目录,因为该脚本可以为您处理所有自动提交和工作!它速度很快,并且在大型存储库上运行良好。现在,有了一个简单的机制,就可以在需要的情况下,通过手机的wifi热点,轻松地在一台机器上使用您选择的任何 IDE,同时在另一台机器上轻松构建或测试,即使存储库为数十GB,而且您很省时间和资源有限。

资源:

  1. 整个项目:https//github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. 在此项目中,请参见源代码本身中的更多链接和参考。
  2. 我怎么称呼它为“硬拉”:如何强制“ git pull”覆盖本地文件?

有关:

  1. git存储库在计算机之间同步时,何时移动?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.