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 に答える