2017-06-15 13 views
1

私はJSchを使ってSSH経由でサーバに接続し、そこでファイルを転送するスキャンコマンドを使用しています。JSchは2回目の呼び出し時に出力を提供しません

コードはテストされ、うまく動作します。コマンドラインにすべての出力を得ました。それでも同じ方法を使用すると、すべてが "機能する"ものの、出力は表示されません。すべてが機能しているかどうかを確認するために出力が必要です。メインアプリボタンが押されたときにこれが起こるで

Scan s = new Scan(getHost(),getUser(),getPassword()); 
s.scan("scanscript \"" + getScancommand() + "\" \"" + getFilename() + "\""); 

scanscriptは、2つのパラメータを必要とする:一つは、全体コマンドscanimage blah blahである - 他の一つは、所望のファイル名です。 Scanscriptは、必要な終了コードも返しますが、常に取得されるわけではありません。あなたは私は何が起こっているのかについての全体の情報を得たコマンドと呼ばれる最初の時間の後に見ることができるように

Jun 15, 2017 9:12:03 PM com.schwaiger.kanva.scan.Scan scan 
INFORMATION: Befehl: scanscript "scanimage --device='brother4:net1;dev0' --format tiff --resolution=150 --source 'Automatic Document Feeder(left aligned,Duplex)' -l 0mm -t 0mm -x210mm -y297mm --batch=$(date +%Y%m%d_%H%M%S)_p%04d.tiff" "testscan1.pdf" 
Connected 
scanimage: rounded value of br-x from 210 to 209.981 
scanimage: rounded value of br-y from 297 to 296.973 
Scanning -1 pages, incrementing by 1, numbering from 1 
Scanning page 1 
Scanned page 1. (scanner status = 5) 
Scanning page 2 
Scanned page 2. (scanner status = 5) 
Scanning page 3 
Scanned page 3. (scanner status = 5) 
Scanning page 4 
Scanned page 4. (scanner status = 5) 
Scanning page 5 
scanimage: sane_start: Document feeder out of documents 
exit-status: 0 
Connected 
exit-status: 0 

:ここ

import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import java.io.InputStream; 
import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.JSchException; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.scene.control.Alert; 
import javafx.scene.control.ButtonType; 


public class Scan { 

    private final String scan_host; 
    private final String scan_user; 
    private final String password; 

    public Scan(String host, String user, String password) { 
     this.scan_host = host; 
     this.scan_user = user; 
     this.password = password; 
    } 




    public void scan(String command) { 
     boolean b_success = true; 

     try { 

      java.util.Properties config = new java.util.Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(scan_user, scan_host, 22); 
      session.setPassword(password); 
      session.setConfig(config); 
      session.connect(); 
      Logger.getLogger(Scan.class.getName()).log(Level.INFO, "Command: {0}", command); 
      System.out.println("Connected"); //This here is displayed always 

      Channel channel = session.openChannel("exec"); 
      ((ChannelExec) channel).setCommand(command); 
      channel.setInputStream(null); 
      ((ChannelExec) channel).setErrStream(System.err); 

      InputStream in = channel.getInputStream(); 
      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()) { 
        if (channel.getExitStatus() != 0) { 
         b_success = false; 
         javafx.scene.control.Alert alert = new Alert(Alert.AlertType.ERROR, "Scan failed\n - Exit-Status: " + channel.getExitStatus(), ButtonType.OK); 
         alert.showAndWait(); 
        } 

        System.out.println("exit-status: " + channel.getExitStatus()); 
        break; 
       } 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException ee) { 
        Logger.getLogger(Scan.class.getName()).log(Level.SEVERE, null, ee); 
       } 
      } 
      channel.disconnect(); 
      session.disconnect(); 
      if (b_success) { 
       javafx.scene.control.Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Scan successful", ButtonType.OK); 
       alert.showAndWait(); 
      } 
     } catch (JSchException | IOException e) { 
      Logger.getLogger(Scan.class.getName()).log(Level.SEVERE, null, e); 
      javafx.scene.control.Alert alert = new Alert(Alert.AlertType.ERROR, "Scan failed: " + e.getLocalizedMessage(), ButtonType.OK); 
      alert.showAndWait(); 
     } 
    } 

} 

は私のコンソール出力です。私がちょうどConnectedと終了ステータスを得た2回目。しかし、私はその状態が私のスクリプトを参照するのか、それとも操作全体を参照するのかを確かめることはできません。

+0

出力はどこにありますか?出力ストリームまたはエラーストリームでは? +「出口コードは必須ですが、**常に得られます**」とはどういう意味ですか? –

+0

@ MartinPrikryl - 編集中。出力は標準のJava-Console出力である – Qohelet

+0

JSchの標準出力またはエラー出力でコマンド出力を受け取った場合、 '((ChannelExec)channel).setErrStream(System.err);をコメントアウトすると、出力を得ることはできませんか? –

答えて

1

このコマンドは、すべての出力をエラーストリームに出力します。

あなたパイプして、Javaコンソールアプリケーションのエラー出力にチャネル・エラー・ストリームは:

((ChannelExec) channel).setErrStream(System.err); 

最初のコマンド実行のチャネルが閉じ、それはそれでコンソールエラー出力をダウンかかります。

次回は、エラー出力が既に閉じられています。それを書き込もうとすると、無視されます。

通常の出力(while (true)ループ)を読み取るのと同じ方法でエラーストリームを読み取る必要があります。 Log stdout and stderr from ssh command in the same order it was created

+0

その男には解決策がありました:https:///stackoverflow.com/a/21748660/2516892 – Qohelet

関連する問題