2

smoeone は、Jsch を使用して複数のファイルをリモート サーバーに送信しようとすることができますか? これは可能でしょうか?

リモートサーバーの既存のファイルとコマンドをチェックするために複数のスクリプト perl を送信しようとしています。その後、結果を含むファイルをローカルマシンに返す必要があります。問題は、そのために eclipse を使用する必要があることです。

エラー:

Bareword found where operator expected at /root/port.pl line 27, near "10.156.31.46 ssh"
    (Missing operator before ssh?)
Bareword found where operator expected at /root/port.pl line 27, near "8HcmdrGQDgXKL"
    (Missing operator before HcmdrGQDgXKL?)
Bareword found where operator expected at /root/port.pl line 27, near "9N1XgcLKUcC1DgFmcYoNLb1VsU9KYRhLAOGiIjWBdRkr6gLhZTJsnd2e464"
    (Missing operator before N1XgcLKUcC1DgFmcYoNLb1VsU9KYRhLAOGiIjWBdRkr6gLhZTJsnd2e464?)
Bareword found where operator expected at /root/port.pl line 27, near "2iIe3zJSlBH1tVd8PCifJaZ6Xu4KqsDFWjIILv8wY5XMWYdxVcPcMOsQhpl7vB2EgZxrc3yxE6rwfGnyxEKWez9W9t6e2hOvx3J21PxAGTaCIPjgxbcM4G"
    (Missing operator before iIe3zJSlBH1tVd8PCifJaZ6Xu4KqsDFWjIILv8wY5XMWYdxVcPcMOsQhpl7vB2EgZxrc3yxE6rwfGnyxEKWez9W9t6e2hOvx3J21PxAGTaCIPjgxbcM4G?)
syntax error at /root/port.pl line 27, near "10.156.31.46 ssh"
Execution of /root/port.pl aborted due to compilation errors.
exit-status: 255

FileOutput を使用すると、このエラーが表示されます

java.io.FileNotFoundException: C:\Users\Computer\workspace\proj (Accès refusé)
4

5 に答える 5

1

Java と Ant スクリプトを使用して、jsch SCP の Get と Put のチュートリアルを作成しました。 jsch チュートリアル

于 2012-05-10T11:16:10.710 に答える
1

はい、かなり簡単にできます。チャネルを開き、バイナリ オブジェクトをチャネルの適切な場所に配置するだけです。複数のファイルで実行したい場合は、順次実行するか、Executor に連続して送信することができます。

Session session = ...;// a new jSch Session with remote attributes (like ip, username and password)
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp csftp = (ChannelSftp) channel;

File file = new File(...); //binary file location to ftp
String fileAbsolutePath = ...;//The to location on remote server

csftp.put(new FileInputStream(file), fileAbsolutePath, file.length());

これはもちろん jSch を使用しています。詳細については、この例を確認してください。

于 2011-06-06T11:49:12.250 に答える
0

質問が明確になった後に編集。

  1. が必要であり、そのメソッドChannelSftpの1つ(または複数)を使用しputます。それらを複数回呼び出しても問題はありません(これは帯域幅を増やすことはありませんが、高レイテンシーに役立つ可能性があります(例についてはジョンの回答を参照してください)。

  2. 次に、を開いChannelExecてスクリプトを実行します。通常、チャネルに複数のコマンド(改行または改行で区切る;)を与えることができます。コマンドはそれらをシェルに渡し、シェルはそれらを順番に実行します。または、ここで複数のチャネルを使用します(次々にまたは同時に)。

  3. 最後のコマンドが終了したら、ChannelSftpもう一度を使用してファイルをダウンロードします(getここでの方法を使用してください)。

これは、ビルドおよび実行パスにライブラリを含める方法を除いて、実際にはEclipseとは関係ありません(含まれている場合は、コメントに記載してください)。

別の方法として、スクリプトをサーバー上のファイルとして実際に使用する必要がない場合はperl、コマンドライン(つまり、execチャネルコマンド文字列)または標準のいずれかでスクリプトを指定できるコマンドのバリアントを使用することもできます。入力(つまり、execチャネルの入力ストリーム内)。詳細については、perlrunのドキュメントを参照してください。結果がファイルに書き込まれず、出力として生成されるようにスクリプトを適合させることができます(これは、execチャネルの出力から読み取ることができます)。


JSchサンプルコレクションのバージョンにサンプルを追加しました。

ここで重要な部分:

InputStream scriptStream =
  new BufferedInputStream(new FileInputStream(arg[0]));

String command = "perl -w - ";

Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);


// input = script
channel.setInputStream(scriptStream);

// TODO: set other streams

channel.connect();

さて、エラーを見てみましょう。

まず、Perlスクリプトにいくつかのエラーがあります。27行目の構文が間違っているようです。この行を見て、問題が見つからない場合は、これについて新しい質問をしてください。

(問題を特定するには、最初にJSchを使用せずにプレーンSSH接続でこれを実行する必要があります。または、最初にコンピューター上でローカルに実行することをお勧めします。)

次に、FileNotFoundException(ちなみに、チャットブロックではe.printStackTrace()なく使用する必要があります)。System.out.println(e);

これAccès refuséは、プログラムにここに書き込む権利がないことを意味します。他のパスからは、これはファイル名ではなく、ディレクトリ名です。ディレクトリをファイルで上書きすることはできません。ファイルを保存する名前を次の場所に使用します。

File file4 = new File("C:\\Users\\Computer\\workspace\\proj\\anime.txt");
于 2011-06-06T11:52:40.000 に答える
0

一度に 1 つのファイルしか送信できませんが、おそらくこれを ZipInput/OutputStream と組み合わせて使用​​し、この方法で複数のファイルを送信できますか?

于 2011-06-06T11:35:10.413 に答える
0

はい、しかし簡単ではありません。Sftp では、1 つのセッションで複数のファイルを送信できます。scpが複数のファイルを送信するときに1つのセッションを使用するかどうかはわかりません。

Ant タスクを使用するか、apache camelを使用して、より高レベルで使いやすいインターフェイスを使用することをお勧めします。

ant タスクは、1 つのジョブを実行する簡単で使いやすいツールです。

一方、キャメルは、エンタープライズ統合パターンに基づいて異なるシステム間で情報を転送する際のあらゆる種類の問題を支援する非常に柔軟なツールです。また、これらの転送を「産業力」にするためのより多くの機能も提供します。

于 2011-06-06T11:35:25.983 に答える