5

私はSSHとJSchが初めてです。クライアントからサーバーに接続するときに、次の 2 つのタスクを実行します。

  1. ファイルのアップロード (を使用ChannelSFTP)
  2. ディレクトリの作成や MySQL データベースの検索などのコマンドを実行する

現時点では、2 つの個別のシェル ログインを使用して各タスクを実行しています (実際には、まだ MySQL クエリのプログラミングを開始していません)。

アップロードの場合、関連するコードは

session.connect();

Channel channel=session.openChannel("sftp");
channel.connect();
ChannelSftp c=(ChannelSftp)channel;
c.put(source, destination);

そして、私が持っているコマンドについて

String command = "ls -l";//just an example 
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);

最初のチャネルの後でセッションを切断してから、2 番目のチャネルを開く必要がありますか? または、セッションを完全に閉じて、新しいセッションを開きますか? 私が言ったように、私はこれに慣れていません。

4

2 に答える 2

8

1 つの SSH セッションは、並列および順次の両方で、任意の数のチャネルをサポートできます。(チャネル識別子のサイズには理論上の制限がありますが、実際にはそれに達することはありません。) これは JSch にも当てはまります。これにより、コストのかかる鍵交換操作をやり直す必要がなくなります。

そのため、通常、新しいチャネルを開く前にセッションを閉じて再接続する必要はありません。私が考えることができる唯一の理由は、両方のアクションに異なる資格情報でログインする必要がある場合です。

ただし、一部のメモリを保護するために、exec チャネルを開く前に SFTP チャネルを閉じることをお勧めします。

于 2011-09-14T16:27:43.817 に答える
3

Jsch を介して複数のコマンドを実行するには、exec の代わりに shell を使用します。シェルは、接続しているシステムのネイティブ コマンドのみをサポートします。たとえば、Windows システムに接続している場合dir、exec チャネルを使用するなどのコマンドを実行することはできません。したがって、シェルを使用することをお勧めします。

次のコードは、Jsch を介して複数のコマンドを送信するために使用できます。

Channel channel = session.openChannel("shell");
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);

channel.connect();
ps.println("mkdir folder");
ps.println("dir");
//give commands to be executed inside println.and can have any no of commands sent.
ps.close();

InputStream in = channel.getInputStream();
byte[] bt = new byte[1024];

while (true) {
    while (in.available() > 0) {
        int i = in.read(bt, 0, 1024);
        if (i < 0) {
            break;
        }
        String str = new String(bt, 0, i);
        //displays the output of the command executed.
        System.out.print(str);

    }
    if (channel.isClosed()) {
            break;
    }
    Thread.sleep(1000);
    channel.disconnect();
    session.disconnect();
}
于 2013-01-03T06:31:41.330 に答える