2017-03-27 18 views
0

JSFを使用してTFTPサーバーにルータの設定を送信しようとしています。 Mainクラスでコードをテストすると動作しますが、このコードをボタンアクションに統合しようとすると動作しません。 これは、これが出力されJSchでSSHで実行されるコマンドに入力/サブコマンドを提供するJSFを使用する

public Void SendConfigViaTftp(Router r) { 
     int port=22; 
     String name = r.getRouterName(); 
     String ip=r.getRouterIP(); 
     String password =r.getRouterPassword(); 
     try 
      { 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(name, ip, port); 
       session.setPassword(password); 
       session.setConfig("StrictHostKeyChecking", "no"); 
      System.out.println("Establishing Connection..."); 
      session.connect(); 
       System.out.println("Connection established."); 


       ChannelExec channelExec = (ChannelExec)session.openChannel("exec"); 

       InputStream in = channelExec.getInputStream(); 
      channelExec.setCommand("enable"); 

     channelExec.setCommand("copy run tftp:"); 
     OutputStream out = channelExec.getOutputStream(); 

     channelExec.connect(); 

     System.out.println("Copy."); 
     out.write(("192.168.18.1 \n").getBytes()); 
     System.out.println("IP."); 
     out.write(name.getBytes()); 
     System.out.println("name."); 
     out.flush(); 
     out.close(); 


       session.disconnect(); 
       return true; 


       } 
     catch(Exception e){System.err.print(e); 

     } 


} 

私のセッションBeanのコードです:

11:53:INFOは、[標準出力](デフォルトタスク-11)接続の確立25279 ...

11時53分:25,516情報[stdout](デフォルトタスク-11)接続が確立されました。

11:53:25,578 INFO [標準出力](デフォルトタスク11)コピー。

11:53:25,578 INFO [標準出力](デフォルトタスク-11)IP。

11:53:25,578 INFO [標準出力](デフォルトタスク-11)の名前です。

これは、私は、問題は私のJSFアプリケーションがOutputStreamのに問題があることを確信している私のボタン

<p:commandButton value="Sauvegarder(TFTP)" action="#{ListBean.sauvegardeTFTP(rtr)}" update=":routeurs" ><f:ajax disabled="true"/></p:commandButton> 

のコードです。誰かが私を助けることができますか?

答えて

0

問題をデバッグするために使用できる情報は私たちには提供されていません。 "それは動作しません"問題の説明ではありません。とにかく


、1つの明白な問題は、コマンドの出力を読み取り、あなたは最後までコマンドを待つために他の方法でそれを交換していないコードを削除したこと、です。したがって、コマンドが終了する前に接続が単に終了し、コマンドが強制終了される可能性があります。クローズするチャネルのための

待ち、セッションを閉じる前に:

while (!channelExec.isClosed()) Thread.sleep(100); 

またはあなたのcommand output stream reading code from your original question(あなたはどこにでも出力を渡す必要はありません)を保持:

InputStream in = channelExec.getInputStream(); 

// ... 

BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
String line; 
while ((line = reader.readLine()) != null) 
{ 
} 

session.disconnect(); 
+0

それは動作します私はメインを含むシンプルなJavaクラスでテストしますが、ボタンアクションでそれを統合すると、説明のように、out.print()を含む行はコメントされているようです。システムはこれらの行を実行せず、エラーを表示しません。 – user6624302

+0

しかしそれはちょうど偶然のことです。接続がどれだけ早く終了するかによって異なります。シンプルな競争状態。私の提案を少なくとも試してみましたか? –

+0

私は試しましたが、ここで私は出力の内容を読むことに気をつけませんでした。コマンドを挿入するだけです。 while((line = reader.readLine())!= null)を使用すると、出力の内容を修復することができます。ここでの問題は、Jsfの出力ストリームは私のためには機能しません。 – user6624302

関連する問題