C++ 有没有办法通过SSH连接打开和读取文件?

C++ 有没有办法通过SSH连接打开和读取文件?,c++,c,linux,ssh,C++,C,Linux,Ssh,我可以访问一些有大量数据的服务器。我无法在我的电脑上复制全部数据 我无法在服务器上编译我想要的程序,因为服务器没有我需要的所有lib 我不认为服务器管理员会很高兴看到我来要求他为我安装一些libs 我想知道是否有一种方法可以像 FILE *fopen(const char *filename, const char *mode); 或 但是通过SSH连接。然后像我通常的程序一样读取文件 计算机和服务器都在运行linux我假设您正在使用linux笔记本电脑,而远程计算机是某种超级计算机 第一个非

我可以访问一些有大量数据的服务器。我无法在我的电脑上复制全部数据

我无法在服务器上编译我想要的程序,因为服务器没有我需要的所有lib

我不认为服务器管理员会很高兴看到我来要求他为我安装一些libs

我想知道是否有一种方法可以像

FILE *fopen(const char *filename, const char *mode);

但是通过SSH连接。然后像我通常的程序一样读取文件


计算机和服务器都在运行linux

我假设您正在使用linux笔记本电脑,而远程计算机是某种超级计算机

第一个非技术性建议:首先请求远程访问数据的许可。在某些工作场所,即使技术上可行,也不允许这样做

您可以将其用于此目的,但需要编写一些代码并阅读其文档

<>你可以考虑使用一些文件系统(在你的笔记本电脑上),例如一些<代码> SSHFS < /代码>;然后,您将能够访问一些超级计算机文件(如
/sshfilesystem/foo.bar
)。这可能是最慢的解决方案,也可能不是一个非常可靠的解决方案。我真的不推荐它

你可以申请使用坐骑的许可

也许您可以考虑使用一些HTTP/HTTPS客户端库(如其他方式,一些HTTP/HTTPS服务器类库)

访问(如果远程计算机对文件有它) 您可能(但先请求许可!)通过或使用某些连接(例如,手动启动远程超级计算机上类似服务器的程序)

最后,您应该考虑安装(即礼貌地请求远程超级计算机上的安装)或使用远程计算机上的一些软件(例如,A或OR或服务器),使您的程序成为数据库客户端应用程序…


顺便说一句,如果您在随机访问中访问几十个TB大小的文件(每个运行读取其中的几千字节),或者一百万个文件,其中给定的运行仅通过顺序读取访问其中的十几个,每个文件的大小合理(数兆字节),情况可能会有所不同。换句话说,DNA数据、视频电影、HTML文档、源代码。。。都是不同的情况

我假设您正在使用Linux笔记本电脑,而远程计算机是某种超级计算机

第一个非技术性建议:首先请求远程访问数据的许可。在某些工作场所,即使技术上可行,也不允许这样做

您可以将其用于此目的,但需要编写一些代码并阅读其文档

<>你可以考虑使用一些文件系统(在你的笔记本电脑上),例如一些<代码> SSHFS < /代码>;然后,您将能够访问一些超级计算机文件(如
/sshfilesystem/foo.bar
)。这可能是最慢的解决方案,也可能不是一个非常可靠的解决方案。我真的不推荐它

你可以申请使用坐骑的许可

也许您可以考虑使用一些HTTP/HTTPS客户端库(如其他方式,一些HTTP/HTTPS服务器类库)

访问(如果远程计算机对文件有它) 您可能(但先请求许可!)通过或使用某些连接(例如,手动启动远程超级计算机上类似服务器的程序)

最后,您应该考虑安装(即礼貌地请求远程超级计算机上的安装)或使用远程计算机上的一些软件(例如,A或OR或服务器),使您的程序成为数据库客户端应用程序…


顺便说一句,如果您在随机访问中访问几十个TB大小的文件(每个运行读取其中的几千字节),或者一百万个文件,其中给定的运行仅通过顺序读取访问其中的十几个,每个文件的大小合理(数兆字节),情况可能会有所不同。换句话说,DNA数据、视频电影、HTML文档、源代码。。。都是不同的情况

好吧,您的问题的答案是否定的,正如已经多次指出的那样(除非您考虑自己实现ssh,这超出了理智的范围)

但当你描述你真正的问题时,可能只是问了一个错误的问题,所以——寻找替代方案:

备选案文1 将要静态使用的库链接到二进制文件。假设您要静态链接libfoo:

  • 确保库搜索路径中有
    libfoo.a
    (库的对象存档)。通常,您的发行版提供的库的开发包已经包含它,如果不包含,请使用选项自己编译库,以启用静态库的创建

  • 假设GNU工具链,使用以下标志构建程序:
    -Wl,-Bstatic-lfoo-Wl,-Bdynamic
    (而不仅仅是
    -lfoo

备选案文2
像往常一样创建二进制文件(链接到动态库)并将该库(
libfoo.so
)放在服务器上的
~/lib
中。然后使用
LD\u LIBRARY\u PATH=~/lib./a.out

在那里运行二进制文件。好吧,正如已经多次指出的那样,您的问题的答案是否定的(除非您考虑自己实现ssh,这超出了正常范围)

但当你描述你真正的问题时,可能只是问了一个错误的问题,所以——寻找替代方案:

备选案文1 将要静态使用的库链接到二进制文件。假设您要静态链接libfoo:

  • 确保库搜索路径中有
    libfoo.a
    (库的对象存档)。通常,您的发行版提供的库的开发包已经包含它,如果不包含,请使用选项自己编译库,以启用静态库的创建

  • 假设GNU也是
    void std::ifstream::open(const char* filename,  ios_base::openmode mode = ios_base::in);
    
    ssh that_server cat /path/to/largefile | ./yourprogram
    
    FILE *stream = popen("ssh user@host cat /path/to/remote/file", "r");
    
    if (stream != 0) {
       /* ... */
      pclose(stream);
    }