質問: ChannelShellを使用しているときに送信したコマンドから「おかしな」文字の出力が得られます。PuTTY セッションで表示される通常の出力だけを取得する方法を知りたいです。
「面白い」とは、これを見るべきだという意味です。
testfile.txt
そして、私はこれを見ています:
[01;32mtestfile.txt[00m
これは、答えが私のニーズを満たさないことを除いて、この質問の問題に似ています。そこにある答えsetPty(false)
は、「疑似端末」を完全に削除するChannelShellを呼び出すことですが、ChannelShellからの出力をリアルタイムで取得する必要があります。これが私がやっていることの例です:
ChannelShell channel = (ChannelShell) session.openChannel("shell");
channel.setOutputStream(new PrintStream(
new ByteArrayOutputStream(), true, "UTF-8") {
@Override
public void write(byte[] b, int off, int len) {
super.write(b, off, len);
String output = new String(b, off, len);
System.out.print(output);
sendNextCommand(output); //Execution of the next command depends on the output here, this is why I need it to not have the funny characters.
}
});
PipedInputStream in = new PipedInputStream();
channelInput = new PipedOutputStream(in);
channel.setInputStream(in);
channel.connect();
while(!channel.isClosed() && channelWaitRetries++ < MAX_CHANNEL_WAIT_RETRIES) {
//Wait for additional output... Sort of a timeout deal. Kind of a hack...
sleep(2500); //Calls Thread.sleep. I just don't want the try/catch here.
System.out.println("Channel not yet closed. Retried " + channelWaitRetries + " of " + MAX_CHANNEL_WAIT_RETRIES);
}
sendNextCommand メソッドは、出力が次のコマンドを実行するために表示する必要があるものと一致するかどうかを確認するためにチェックが行われる場所です。したがって、基本的に、次のようなものが表示された場合:[user@server ~]$
次に、これを実行します:ls
これを返す必要があります:testfile.txt
しかし、代わりにこれを返しています: [01;32mtestfile.txt[00m
(注: 最初の文字をコピーして貼り付けることはできませんが、char コードが 27 のボックスですこれはエスケープ文字だと思います)。
今、私は通常、この種のことを回避するだけですが、むしろそれを正しく実行したいと考えています。また、奇妙さにはいくつかのバリエーションがあるようです. だからここにいます。あなたが助けてくれることを願っています:)
注: IDE (Eclipse rip-off) を介して Windows マシンでこれを実行していますが、デバッグを試みたところ、変数output
は実際には「変な」文字を示しています。JOptionPane.messageDialog
また、それが単なる IDE ではなく、文字がまだ含まれていることを確認するために、それを表示しようとしました。ありがとう!