将二进制文件复制到C ++中的远程位置

时间:2016-05-27 13:26:37

标签: c++ qt ssh hdf5 libssh

我正在尝试将本地计算机上的hdf5二进制文件复制到远程计算刀片。我使用libssh在我的Qt应用程序生成它们之后复制所需的目录。使用libssh我可以打开ssh_session,验证它,打开一个频道并发送远程命令。

for (QStringList::iterator it = ipList.begin(); it != ipList.end(); ++it)
{
    ssh_session my_session = new ssh_new();
    QString ip_address = *it;
    ssh_options_set(my_session, SSH_OPTIONS_HOST, ip_address.toStdString().c_str());

    // Connect...Authenticate using public key....

    QString command = QString("rm -r %2; cp -r %1 %1; cp /local/file.txt /remote/file.txt").arg(local_dir, remote_dir);
    execute_remote_command(my_session, command.toStdString().c_str());
        // Open channel and execute command

    ssh_disconnect(my_session);
    ssh_free(my_session);
}

正在为每个计算刀片执行此命令。在我正在关闭的每个呼叫之间以及打开到下一个刀片的ssh会话。这些文件使它成为刀片,但它们似乎已损坏。它们的文件大小完全相同。我还没有找到一种方法来比较各个字节,看看它们是多么腐败,任何提示都会受到赞赏。

当我在单独的测试终端程序中运行我的ssh复制命令时,文件看起来完整无缺并且在刀片上可读。只有在Qt GUI程序中移动文件时才会出现此问题。

编辑:因此深入研究出现了什么问题,看来远程服务器上的文件大小不一样。它似乎缺少大部分字节。最重要的是,当我用文件的本地版本逐字节检查是什么时,几乎所有的字节都不同。

1 个答案:

答案 0 :(得分:0)

原来的答案是,在调用SSH命令之前,HDF5编写器没有正确关闭。我通过动态分配其他人编写的自定义H5类来修复问题,并确保在调用SSH命令之前删除它。原来,编写HDF5读写类的人没有正确处理文件的打开和关闭,也没有提供这样做的功能。

以下是我所谈论的一个例子。

HDF5writer_class *hdf5_writer = new HDF5writer_class();
hdf5_writer->create_file("/local/machine/hdf5_file.h5");

// ... add the data to the file

delete hdf5_writer;

// Open SSH Session and run the copy commands

简而言之,请确保在您尝试复制之前关闭并发布您正在编写的文件。