10

Windows XPでJavaを使用していて、telnetなどの別のプログラムにコマンドを送信できるようにしたいと考えています。単に別のプログラムを実行したくありません。それを実行し、実行されたら一連のコマンドを送信したいと思います。これが私がやりたいことの私のコードですが、それは機能しません:(コメントを外してコマンドを「cmd」に変更すると、期待どおりに機能します。助けてください。)これは単純化された例です。本番環境ではさらに多くのコマンドが送信されるため、「telnetlocalhost」の呼び出しを提案しないでください。

    try
    {
        Runtime rt = Runtime.getRuntime();

        String command = "telnet";
        //command = "cmd";
        Process pr = rt.exec(command);

        BufferedReader processOutput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));

        String commandToSend = "open localhost\n";
        //commandToSend = "dir\n" + "exit\n";

        processInput.write(commandToSend);
        processInput.flush();

        int lineCounter = 0;
        while(true)
        {
            String line = processOutput.readLine();
            if(line == null) break;
            System.out.println(++lineCounter + ": " + line);
        }

        processInput.close();
        processOutput.close();
        pr.waitFor();
    }
    catch(Exception x)
    {
        x.printStackTrace();
    }
4

4 に答える 4

3

それはあなたの質問に対する直接の答えではありませんが...

Runtime.exec()を使用する代わりに、を使用して( )ProcessBuilderにリダイレクトstderrする必要があります。そうしないと、プロセスが何かを書き込んだ場合にプロセスがブロックされる可能性があります(プロセスの出力が読み取られない場合、Windowsはそれを好みません)。stdoutProcessBuilder.redirectErrorStream(true)stderr

于 2010-05-20T20:46:38.520 に答える
3

それほど多くの出力を生成しないので、それは問題ないように見えますが、実際には別々のスレッドで読み取りと書き込みを行う必要があります。これにより、バッファがいっぱいになり、次のステップに進む前に読み取りを待機するブロックが発生しなくなります。

したがって、送信したコマンドをフラッシュするポイントに達した場合は、送信するテキストをコマンドで標準入力にパイプすることにより、Windowstelnetクライアントがコンソールではなく標準入力からのコマンドの受信をサポートしているかどうかを確認します。促す。

たとえば、 cmdを実行し、c:ドライブの内容を一覧表示して終了します。これは、コンソールecho dir c:\ | cmdに入力した場合とほぼ同じ動作です。dir c:\ただしecho open localhost | telnet、Telnetは、コンソールに入力した場合と同じように動作するのではなく、画面をクリアして終了します。telnetはパスワードのユーザー入力をマスクする必要があるため、標準の入力から読み取るのではなく、コンソールAPIを使用している可能性が非常に高くなります。標準入力から読み取るように指示するコマンド引数がリストされていないので、スクリプトに適したtelnet実装を使用する必要があるかもしれません

于 2010-05-20T20:48:53.503 に答える
3

Javaからプログラムでtelnetセッションを制御したい場合は、このJava telnetライブラリを使用できる可能性があります...同じこと(接続を開く、ユーザー名/パスワードの送信、コマンドの送信、結果の受信)を実行できますが、実際には生成されません別のプロセス。

于 2010-05-20T20:54:18.060 に答える
1

ファイルを使用せずにコード内で直接呼び出すことができるTelnetAntタスクbuild.xmlを確認できます。

また、ソースコードを見て、それらがどのように機能するかを確認することもできます。

于 2010-05-20T20:59:21.420 に答える