Java Processbuilder OutputStream - PullRequest
       4

Java Processbuilder OutputStream

0 голосов
/ 07 марта 2020

В настоящее время я работаю над каким-то удаленным cmd в java, и я использую ProcessBuilder для запуска сеанса cmd. Но у меня проблема в том, что я могу получить выходные данные cmd, но я не знаю, как отправить команды в сеанс Running cmd, чтобы они выполнялись.

Это мой код сервера:

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.

1 Ответ

0 голосов
/ 09 марта 2020

Я вроде исправил это сам. Мне нужно было прочитать входной поток сокета в буфер, а затем записать его в выходной поток 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) {
                        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...