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

时间:2010-11-18 16:00:19

标签: c eclipse ssh eclipse-cdt remote-debugging

我有以下方框:

  1. 带有Eclipse CDT的Windows框,
  2. 一个Linux机器,只能通过SSH访问我。
  3. 构建和运行我的项目所需的编译器和硬件都只在机器B上。

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

    如何设置:

    • 建筑物会起作用吗?任何比编写本地makefile更简单的解决方案,它会rsync项目,然后调用远程makefile来启动实际构建? Eclipse托管构建是否具有该功能?
    • 调试会有效吗?
    • 最好 - Eclipse CDT代码索引可以工作吗?我是否必须将所有必需的头文件从机器B复制到机器A并将它们手动添加到包含路径?

9 个答案:

答案 0 :(得分:205)

尝试Remote System Explorer(RSE)。这是一组完全符合您要求的插件。

RSE可能已包含在您当前的Eclipse安装中。要签入Eclipse Indigo,请转到窗口> 开放视角> 其他... 并从 Open Perspective 对话框中选择远程系统资源管理器以打开RSE透视图。

从Eclipse中的RSE透视图创建SSH远程项目:

  1. 定义新连接,并从“新建连接”对话框的“选择远程系统类型”屏幕中选择“仅限SSH”。
  2. 输入连接信息,然后选择完成。
  3. 连接到新主机。 (假设已经设置了SSH密钥。)
  4. 连接后,深入查看主机的 Sftp文件,选择一个文件夹,然后从项目的上下文菜单中选择创建远程项目。 (等待创建远程项目。)
  5. 如果操作正确,现在应该可以从Project Explorer和eclipse中的其他视角访问新的远程项目。通过正确的SSH连接设置,密码可以成为正常SSH身份验证过程的可选部分。现在创建了一个使用Eclipse通过SSH的远程项目。

答案 1 :(得分:11)

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

当然,只有当Linux上的Eclipse出现在盒子上并且你的网络连接足够快时才能实现这一点。

优势在于,由于所有内容都是本地的,因此您不会遇到同步问题,也不会遇到任何棘手的跨平台问题。

如果盒子上没有eclipse,你可以考虑通过SMB(或SSHFS)共享你的linux工作目录,并从你的windows机器访问它,但这需要相当多的设置。

两者都比拥有两份副本更好,特别是当它是跨平台时。

答案 2 :(得分:6)

我自己(或曾经)在同一个地方,我最后检查了Linux主机上的samba共享,并在Windows机器上使用notepad ++在本地编辑该共享,然后我在Linux机器上编译油灰。 (我们不允许更新Linux主机上的10个版本的编辑器,它没有Java,所以我放弃了X11转发)

现在......我在Windows主机上的VM中运行现代Linux,将我想要的所有工具(例如CDT)添加到VM,然后我签出并构建一个非常类似于RTE的chroot监狱。

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

答案 3 :(得分:3)

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

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

构建我的远程代码非常简单:ssh address remote_make_command

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

答案 4 :(得分:2)

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

1)我使用makefile构建我的项目,而不是由eclipse管理 2)我使用SAMBA连接来编辑Eclipse中的文件 3)建设项目:    Eclipse使用makefile调用“本地”make,打开SSH连接    到Linux主机。在SSH命令行上,您可以提供参数    在Linux主机上执行。我为该参数使用makeit.sh shell脚本    在linux主机上调用“真正的”make。    构建你的不同目标也可以通过参数给出    本地makefile - > makeit.sh - > linux主机上的makefile。

答案 5 :(得分:1)

我试过ssh -X,但速度太慢了。我也尝试过RSE,但它甚至不支持使用Makefile构建项目。

我读到NX比X11转发更快,但我无法让它工作。

最后,我发现我的服务器支持X2Go(如果您没有,则链接有安装说明)。现在我只需要:

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

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

答案 6 :(得分:1)

我解决这个问题的方法是:

对于窗户:

  1. 使用 samba 从 Linux 机器导出“workspace”目录。
  2. 在 Windows 本地安装它。
  3. 运行 Eclipse,使用挂载的“workspace”目录作为 Eclipse 工作区。
  4. 导入您想要的项目并进行处理。

对于 Linux:

  1. 使用 sshfs 挂载“workspace”目录
  2. 运行 Eclipse。
  3. 运行 Eclipse,使用挂载的“workspace”目录作为 Eclipse 工作区。
  4. 导入您想要的项目并进行处理。

在这两种情况下,您都可以通过 Eclipse 构建和运行,或者通过 ssh 在远程机器上构建。

答案 7 :(得分:0)

对于这种情况,您可以使用ptp eclipse https://eclipse.org/ptp/进行源浏览和构建。

您可以使用此插件调试应用程序

http://marketplace.eclipse.org/content/direct-remote-c-debugging

答案 8 :(得分:0)

此答案当前仅适用于使用两台Linux计算机(或者也许也可以在Mac上使用?–在Mac上尚未使用)(从另一台同步到另一台),因为我用bash编写了此同步脚本。它只是git周围的包装器,因此,可以随意使用它并将其转换为跨平台的Python解决方案,或者根据需要将其转换为


这并不能直接回答OP的问题,但是它是如此接近,我保证它将回答其他人落在此页面上的问题(实际上,是我的第一个来这里的人, 编写自己的解决方案),因此无论如何我都将其发布在这里。

我要:

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

我们将第一台我写代码“ 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插入存储库,并检查是否存在任何未提交的 local 更改。如果是这样,它将创建一个从当前分支派生的新备份分支(示例名称:my_branch_SYNC_BAK_20200220-0028hrs-15sec <-请注意,这是YYYYMMDD-HHMMhrs--SSsec),并使用提交消息将对该分支的所有未提交的更改提交,例如作为在PC2(目标PC /内置计算机)上备份所有未提交的更改。现在,它签出SYNC分支,如果它不在本地计算机上,则将其从远程存储库中拉出。然后,它获取远程存储库上的最新更改,并进行硬重置以强制本地SYNC存储库与远程SYNC存储库匹配。您可能将其称为“硬拉”。这是安全的,因为我们已经备份了PC2上本地所做的所有未提交的更改,因此不会丢失任何信息!
  3. 就是这样!现在,您已经生成了从PC1到PC2的完美副本,而无需确保干净的工作目录,因为脚本可以为您处理所有自动提交和工作!它速度很快,并且在大型存储库上效果很好。 现在,您拥有一种简便的机制,可以在一台计算机上使用自己选择的 any IDE,同时可以在另一台计算机上轻松构建或测试手机上的wifi热点(如果需要),即使该存储库为数十GB,并且您受时间和资源的限制。

资源:

  1. 整个项目:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
    1. 在此项目中的源代码本身中查看更多链接和参考。
  2. 如何进行“硬拉”,我称之为:How do I force "git pull" to overwrite local files?

相关:

  1. git repository sync between computers, when moving around?