10

我在 Windows XP 上使用 Java,并且希望能够将命令发送到另一个程序,例如 telnet。我不想简单地执行另一个程序。我想执行它,然后在它运行后向它发送一系列命令。这是我想要做的代码,但它不起作用:(如果您取消注释并将命令更改为“cmd”,它会按预期工作。请帮助。)这是一个简化的示例。在生产中会发送更多的命令,所以请不要建议调用“telnet localhost”。

    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

这看起来不错,因为它不会产生那么多输出,但是您应该真正在单独的线程中读取和写入,这样它就不会填满缓冲区并阻塞等待您在进入下一步之前读取。

因此,如果它达到了刷新发送给它的命令的程度,请通过在命令中将您发送到其标准输入的文本传送给它来确定 Windows telnet 客户端是否支持从标准输入而不是控制台接收命令迅速的。

例如,使 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 回答
3

这不是您问题的直接答案,但是...

Runtime.exec()您应该使用 aProcessBuilder并重定向stderrstdout( ProcessBuilder.redirectErrorStream(true)) ,而不是使用。否则,如果您的进程向其中写入内容,则它可能会阻塞stderr(当未读取进程的输出时,Windows 不喜欢它)。

于 2010-05-20T20:46:38.520 回答
1

您可以查看Telnet Ant 任务,您可以直接在代码中调用它而无需使用build.xml文件。

您还可以查看源代码,看看他们是如何做到的。

于 2010-05-20T20:59:21.420 回答