2011-09-14 9 views
4

SSHとJSchを初めて使用しています。私は私のクライアントからサーバーに接続すると私は2つのタスクを実行したい:JSchで複数の操作を実行する方法

  1. ChannelSFTPを使用して)ファイルをアップロード
をディレクトリを作成し、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のチャネルを開く必要がありますか?またはセッションを完全に閉じて新しいセッションを開きますか?私が言ったように、私はこれに新しいです。

+1

を通じてだけのノートを(あなたがJSCHに新しく追加されたとして)複数のコマンドを送信するために使用することができます。 github.com/jsch-documentation/simple.javadoc/)を参照してください。 –

+0

ありがとうございます。私はそれを見てみましょう... –

答えて

6

1つのSSHセッションで、任意の数のチャネルをサポートできます(パラレルでもシーケンシャルでも)。 (チャネル識別子のサイズには理論的な制限がありますが、実際にはそれをヒットしません)。これはJSchでも有効です。これは、コストのかかるキー交換操作のやり直しを軽減します。

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

メモリを安全に使用するには、execチャネルを開く前にSFTPチャネルを閉じることが必要な場合があります。

+0

あなたはクライアント(JSch)またはサーバー(SSHサーバー)にメモリを節約することについて話していますか? –

+0

私は主にクライアントを意味していましたが(これはJSchで制御するものです)、この場合はSFTPサーバープロセスを含むすべてのオープンチャネルに対してサーバーにもオーバーヘッドが発生すると思います。 –

+0

サーバ上の複数のチャネル、特に 'exec'チャネルのオーバーヘッドはかなり大きいと思いますか? –

2

jschで複数のコマンドを指定する場合 execの代わりにシェルを使用します。 シェルは、接続システムのネイティブコマンドのみをサポートします。 ex Windowsシステムに接続するときは、execチャネルを使用してdirのようなコマンドを実行できません。 シェルを使う方が良いです。 // epaul:私は[Javadocドキュメント](HTTPを作成しました:

次のコードは、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(); 
      } 
+4

いいえ、シェルチャネルを使用する方が良いわけではありません。複数のexecチャネルを使用する方が望ましい方法です。シェルチャネルは、自動化ではなく対話型セッションを実装するためのものです。 –