我目前正在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/