在Java中,将命令发送到另一个命令行程序

时间:2010-05-20 20:37:36

标签: java command-line process send sqlcommand

我在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 个答案:

答案 0 :(得分:3)

这不是你问题的直接答案,而是......

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

答案 1 :(得分:3)

看起来没问题,因为它不会产生那么多输出,但是你应该在单独的线程中进行读写,这样它就不会填满缓冲区并在你到达下一步之前阻止你等待阅读。

因此,如果它已达到您刷新发送给它的命令的点,请确定Windows telnet客户端是否支持从标准输入而不是控制台接收命令,方法是将您发送的文本通过管道传输到其标准输入在命令提示符下。

例如,echo dir c:\ | cmd导致cmd运行,列出c:驱动器内容并退出,就像在控制台中键入dir c:\一样。但是echo open localhost | telnet导致telnet清除屏幕然后退出,而不是像在控制台中键入它一样。由于telnet需要屏蔽密码的用户输入,因此它很可能是使用console API而不是读取标准输入。它help没有列出任何命令参数来告诉它从标准输入读取,所以你可能需要使用更适合编写脚本的telnet实现。

答案 2 :(得分:2)

如果您想以编程方式从Java控制telnet会话,您可以使用此Java telnet library ...您可以执行相同的操作(打开连接,发送用户名/密码,发送命令和接收结果) )但实际上没有产生一个单独的过程。

答案 3 :(得分:1)

您可以查看Telnet Ant task,直接在代码中调用它,而不必使用build.xml文件。

您还可以查看source code,看看他们是如何做到的。