2016-11-29 9 views
0

JSchを使ってリモートのWindowsマシンにsshセッションを作成しました。 Windowsマシンには、リモートクライアントからのsshを受け入れるためにcygwinがインストールされています。私はコマンドを使用して実行可能なチャンネルを開設したコマンド、JSchの複数の実行可能なチャネルを同期させる方法は?

Channel channel = client_session.openChannel("exec"); 

を実行するために私は1つのチャンネルからマシンに共有ディレクトリをマッピングしています。同じチャネルを別のコマンドを実行するために使用することはできませんので、私はマップされたドライブを取得するために同じセッションの別のチャネルを使用しています。

しかし、私は以前にマップされたドライブ自体(私は以前、同じコードでマッピングされたもの)を取得しておりません。これら2つのチャンネルを同期させる方法。私が実行した後に得た出力がある

Channel channel = client_session.openChannel("exec"); 
((ChannelExec)channel).setCommand("net use Y: \\\\\\\\share\\\\directory /USER:WORKGROUP\\\\User password"); 
channel.connect(); 

channel = client_session.openChannel("exec"); 
((ChannelExec)channel).setCommand("net use"); 
channel.connect(); 

以下のように私が使用したコードはまた、私が必要とする前のコマンドの出力に基づいて、マッピングされたディレクトリに複数のコマンドを実行する必要があり、

The command completed successfully. 

exit-status: 0 
New connections will be remembered. 


Status  Local  Remote     Network 

------------------------------------------------------------------------------- 
Unavailable Y:  \\share\directory  Microsoft Windows Network 
The command completed successfully. 

exit-status: 0 

です同一のマッピングされたディレクトリでいくつかのコマンドを実行します。私はチャネルが同期している場合、複数のコマンドを実行している問題が解決されると思います。

public void method() 
{ 
    Channel channel = null; 
    try 
    { 
     channel = client_session.openChannel("exec"); 
     ((ChannelExec) channel).setCommand("net use Y: \\\\\\\\share\\\\directory /USER:WORKGROUP\\\\User password"); 
     channel.connect(); 
     byte[] tmp=new byte[1024]; 
     while(true) 
     { 
      while(in.available()>0) 
      { 
       int i=in.read(tmp, 0, 1024); 
       if(i<0) 
        break; 
       System.out.print(new String(tmp, 0, i)); 
      } 
      if(channel.isClosed()) 
      { 
       System.out.println("exit-status: "+channel.getExitStatus()); 
       break; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.getStackTrace()[0].getLineNumber()); 
     System.out.println(e.toString()); 
    } 
    try 
    { 
     channel = client_session.openChannel("exec"); 
     ((ChannelExec)channel).setCommand("net use"); 
     channel.connect(); 
     byte[] tmp=new byte[1024]; 
     while(true) 
     { 
      while(in.available()>0) 
      { 
       int i=in.read(tmp, 0, 1024); 
       if(i<0) 
        break; 
       System.out.print(new String(tmp, 0, i)); 
      } 
      if(channel.isClosed()) 
      { 
       System.out.println("exit-status: "+channel.getExitStatus()); 
       break; 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println(e.getStackTrace()[0].getLineNumber()); 
     System.out.println(e.toString());   
    } 
} 
+0

は、コマンドの実行を自動化するために使用されるものではありません。そして、それはまた、どの出力がどのような命令から来るのか、どのコマンドから来るのかを伝えるのが難しくなります。 –

+0

を使用しない –

答えて

0

別のチャンネルを開く前に、最初のチャンネルを閉じるのを待ちます。

使用Channel.isClosed method

シェルチャネル@ScaryWombat `shell`チャネル
+0

私もそのことを試みました。しかし、出力に変化はありません。 –

+0

このステートメントは別のセッションの種類のチャネルまたはチャネル 'channel = client_session.openChannel(" exec ");' –

+0

を実際に作成します。実際には、あなたの質問を慎重に読んでください:Y:ドライブは 'net use'出力にあります。はい、私は "利用不可"の状態が表示されます。しかし、Windowsコンソールですぐに2つのコマンドを実行したときに結果が異なることは確かですか? 'net use Y:\\ share \ directory/USER:WORKGROUP \ユーザーパスワード&ネット使用'と同様。 –

関連する問題