0

我正在尝试将本地机器上的 hdf5 二进制文件复制到远程计算刀片。在我的 Qt 应用程序生成所需的目录或文件后,我正在使用 libssh 将它们复制出来。使用 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 程序中移动文件时出现。

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

4

1 回答 1

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

长话短说,在尝试复制之前,请确保您正在编写的文件已关闭并发布以供使用。

于 2016-05-27T18:56:22.637 回答