Java Processbuilder 输出流

标签 java sockets cmd

我目前正在java中开发某种远程cmd,并且我正在使用ProcessBuilder来运行cmd session 。但我有一个问题,我可以获得 cmd 的输出,但我不知道如何将命令发送到正在运行的 cmd session 中以便执行它们。

这是我的服务器代码:

ServerSocket server = new ServerSocket(port);
                while(true){
                    Socket socket = server.accept();
                    new Thread(() -> {
                        try {

                        ProcessBuilder processBuilder = new ProcessBuilder();
                        processBuilder.command("cmd.exe");
                        Process process = processBuilder.start();
                        Thread.sleep(100);
                        process.getOutputStream().write("dir".getBytes());

                        while(process.isAlive() && !socket.isClosed()) {
                            while(process.getInputStream().available() > 0) {
                                socket.getOutputStream().write(process.getInputStream().read());
                            }
                            while(process.getErrorStream().available() > 0) {
                                socket.getOutputStream().write(process.getErrorStream().read());
                            }
                            while(socket.getInputStream().available() > 0) {
                                System.out.println("input");
                                process.getOutputStream().write(socket.getInputStream().read());
                            }
                        }
                        System.out.println("EXIT");
                        socket.close();
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }).start();
                }

这是我的客户端代码:

Socket s = new Socket(ip, Main.CMD_PORT);
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            while(!closed) {
                String line;
                if(s.getInputStream().available() > 0 && (line = br.readLine()) != null) textArea.append(line + "\n");
                if(buffer != "")  {
                    s.getOutputStream().write(buffer.getBytes());
                    buffer = "";
                }           
            }
            System.out.println("END");
            s.close();
            dispose();

缓冲区包含应执行的命令。 现在,当我运行两者时,我得到以下输出,但无法运行命令。

Microsoft Windows [Version 10.0.18362.657]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.

最佳答案

我现在自己修复了它。我需要将套接字输入流读取到缓冲区,然后将其写入 cmd.exe 的输出流

try {

                        ProcessBuilder processBuilder = new ProcessBuilder();
                        processBuilder.redirectErrorStream(true);
                        processBuilder.command("cmd.exe");
                        Process process = processBuilder.start();
                        System.out.println("Console Started");
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                        while(process.isAlive()) {
                            while(process.getInputStream().available() > 0) {
                                int i = process.getInputStream().read();
                                socket.getOutputStream().write(i);
                            }
                            while(socket.getInputStream().available() > 0) {
                                String line = br.readLine();
                                bw.write(line);
                                bw.newLine();
                                bw.flush();
                            }
                        }
                        process.destroy();
                        socket.close();
                        } catch(Exception e) {
                        }

关于Java Processbuilder 输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60577441/

相关文章:

php - 如何使用cmd批量多次运行.php脚本?

Microsoft PowerPoint 2010 中的 Java 应用程序

java - HttpClient 无法连接到端口 993?

c++ - UDP 套接字。如何确定数据是否发送到线路?

cmd - 静默命令 net stop

windows - cURL 输出到文件

java - 如何在Java中启动输出受限的双端队列?

java - 为什么 Java 不允许 Throwable 的泛型子类?

Java 和 JavaFX 安全

c++ - DisableAddressSharing注册表不起作用