1

質問: 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 ではなく、文字がまだ含まれていることを確認するために、それを表示しようとしました。ありがとう!

4

2 に答える 2

3

はい、これらはls、色を制御するための ANSI エスケープ シーケンスです。

ls特定の問題を解決する--color=neverオプションがありますls

これはすべてのコマンドで発生していますか、それとも一部だけですか?

通話ChannelShell.setPtyType("dumb")も役立つ可能性があります (テストされていません)。エスケープ シーケンスを無効にする端末の種類を見つけるには、いじる必要があるかもしれません。

ls組み込みの Java メソッドを使用してディレクトリの内容をチェックするのではなく、シェルを使用している特定の理由はありますか?

于 2013-06-26T15:56:43.953 に答える
0

これは暗闇での完全なショットですが、UNIX/Windows のテキスト エンコーディングの問題か、正しく解析されていない UNIX カラー コードがいくつかあるようです。以前に見たことがあります-通常、色をサポートしていないUnix / Linuxの古いシェルで、または古いcシェル端末を呼び出すUNIXマシンにsshされたCygwinシェルで(私たちはいくつかの非常に古いSolaris 8マシンを実行しています-バーフ)。

参考になるかわかりませんが、何か考えるきっかけになれば幸いです。

于 2013-06-26T15:01:49.237 に答える