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

在Java中,将命令发送到另一个命令行程序,java,command-line,process,send,sqlcommand,Java,Command Line,Process,Send,Sqlcommand,我在Windows XP上使用Java,希望能够向另一个程序(如telnet)发送命令。 我不想简单地执行另一个程序。我想执行它,然后在它运行时发送一系列命令。 以下是我想做的事情的代码,但它不起作用: (如果您取消注释并将命令更改为“cmd”,它将按预期工作。请提供帮助。) 这是一个简化的例子。在生产环境中,将发送更多的命令,因此请不要建议调用“telnet localhost”。 try { Runtime rt = Runtime.getRuntime();

我在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();
    }

这不是对你问题的直接回答,但是


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

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

因此,如果它到达刷新发送给它的命令的位置,则通过在命令提示符中将要发送到其标准输入的文本管道化到Windows telnet客户端,来确定Windows telnet客户端是否支持从标准输入而不是控制台接收命令


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

如果您想从Java编程控制telnet会话,您可能可以使用此。。。您可以执行相同的操作(打开连接、发送用户名/密码、发送命令和接收结果),但实际上不需要生成单独的进程。

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


您还可以查看,看看他们是如何做到这一点的

那么,您想要一个java进程间通信解决方案吗?在我看来,telnet似乎在将其输出写入进程输入流以外的内容,而java并没有捕获它。Process.getInputStream()是读取进程输出内容的唯一方法吗?这与“直接回答”非常接近-您可以启动进程并从
Process.getOutputStream()
读取输出,并将命令写入
Process.getInputStream()
我尝试过这个方法,但也遇到了同样的问题。telent的输出未被读取。程序执行时不打印任何内容。从Java代码的角度来看,对D.Shawley编写的内容进行了一个小小的更正,实际上您从
Process.getInputStream()
读取并写入
Process.getOutputStream()
。。。命名令人困惑,它们显然是从不同的角度命名的……telent只是一个例子。我需要这是通用的,这样我就可以执行任何可执行文件和写命令到itI同意。这是一个显示我的问题的简化示例,所以我将其保留为单线程。你能解释一下你所说的标准输入与控制台和管道文本是什么意思吗?@bradvido嗯,
echo open localhost | telnet
不起作用,但
echo dir c:| cmd
起作用,所以我强烈怀疑Windows telnet客户端使用控制台API来检测按键而不是读取其输入流。我现在看到了。这显然是我遇到的问题。你知道我如何写应用程序的控制台而不是输入流吗?