【问题标题】:Runtime Process BufferedReader not outputting all lines (Psexec)运行时进程 BufferedReader 未输出所有行 (Psexec)
【发布时间】:2014-10-12 01:18:54
【问题描述】:

我正在尝试使用 Process InputStream 上的 BufferedReader 将 Psexec 的输出读入 Java,以便在网络上使用,但它只输出第一行。

Runtime rt = Runtime.getRuntime();

    try {
        Process p = rt.exec("C:\\Users\\*****\\Desktop\\PS\\Psexec \\\\" + "******" + " -u ****** -p ****** cmd /c dir D:\\");

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

        log.add("Computer: " + address);

        String s = null;
        while ((s = stdInput.readLine()) != null) {
            log.add(s);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

发生这种情况的原因是什么?如何解决?

【问题讨论】:

  • 尽量不要使用BufferedReader,而是尝试从InputStream读取每个字符
  • @MadProgrammer 这不起作用,仍然打印出相同的数量。
  • 那可能是 psexec 的错误,为什么不尝试自己进行 telnet 会话?
  • 这可能是Process 无法读取进程的标准输出的时候之一,因为输出没有通过标准输出发送......

标签: java process bufferedreader psexec


【解决方案1】:

可能是您启动了该过程,但没有等待它完成,然后才检查它的输出。如果是这种情况,您的主线程将退出您的 while 循环,因为即使子进程仍在执行,它也会读取 null。我建议使用Process.waitFor(),以便在开始轮询之前所有输出都在流中结束。

【讨论】:

    【解决方案2】:

    该进程可能在stderr. 上产生了一些输出或者在单独的线程中读取输出和错误流,或者使用ProcessBuilder 创建Process, 并在你这样做之前合并输出流所以,redirectErrorStream()。

    【讨论】:

    • 试过了,确实得到了远程机器的输出:P
    • @MadProgrammer 我可以举个例子吗?
    • @Funkydiddykong 抱歉,这应该是“没有” - 我快速尝试了 paexec 并获得了更好的结果,请参阅我的“扩展评论”/答案以获取更多详细信息...
    • 对不起,我尝试使用 ProcessBuildr,我线程化了错误和输入流的原因,当我得到“psexec”输出时,我没有得到远程计算机输出。两个命令(由 psexec 报告)都与“0”竞争。我什至尝试通过 PIPE 和 INHERITED 将错误/输入重定向到文件,没有任何区别。见“扩展评论”/答案
    【解决方案3】:

    所以,我花了一些时间来解决这个问题,使用 ProcessBuilder。

    我尝试通过 INHERITED 和 PIPE 选项重定向 IO,但无法让它显示远程命令的输出(psexec 内容很好)

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class Test1 {
    
        public static void main(String[] args) {
            ProcessBuilder pb = new ProcessBuilder(
                            "C:\\Users\\shane\\Downloads\\PSTools\\PsExec.exe",
                            "\\\\builder",
                            "-u",
                            "xxx",
                            "-p",
                            "xxx",
                            "cmd", 
                            "/c", "dir", "c:\\"
            );
            try {
                Process p = pb.start();
                StreamConsumer.consume(p.getErrorStream());
                StreamConsumer.consume(p.getInputStream());
                System.out.println("Exited with :" + p.waitFor());
            } catch (IOException | InterruptedException exp) {
                exp.printStackTrace();
            }
        }
    
        public static class StreamConsumer implements Runnable {
    
            private InputStream is;
    
            public StreamConsumer(InputStream is) {
                this.is = is;
            }
    
            public static void consume(InputStream is) {
                StreamConsumer consumer = new StreamConsumer(is);
                new Thread(consumer).start();
            }
    
            @Override
            public void run() {
                try {
                    int in = -1;
                    while ((in = is.read()) != -1) {
                        System.out.print((char)in);
                    }
                } catch (IOException exp) {
                    exp.printStackTrace();
                }
            }
    
        }
    
    }
    

    我什至尝试将InputStreams 重定向到File,但没有成功。似乎psexec 用于从远程机器流式传输结果的任何机制似乎都没有被 Java 接收。

    您可以尝试PAExec,它确实有效,但在远程命令退出后似乎没有等待退出...

    【讨论】:

    • @Funkydiddykong 一些可执行文件可能真的很痛苦——众所周知,执行 python 会出现类似问题(无输出)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多