gpt4 book ai didi

等待输入的 Java ProcessBuilder 进程

转载 作者:可可西里 更新时间:2023-11-01 11:28:57 31 4
gpt4 key购买 nike

当通过 ProcessBuilder(特别是“GetMac/s”)运行命令行命令时,如果它抛出错误或正常返回,我可以读取错误或它返回的 MAC 地址,但如果它提示用户输入(某些 pc 的在网络上使用 getmac 时需要密码)进程将挂起等待密码。

这是从命令行运行时命令的作用: enter image description here

这是我在该过程中使用的代码:

package testing;
import java.io.IOException;

class test1 {
public static void main(String[] args){
String hostName = "testpc";
ProcessBuilder builder = new ProcessBuilder("getmac", "/s", hostName, "/nh");
builder.inheritIO();
try {
Process proc = builder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}

我需要 mac 的原因是为了在 lan 程序上进行唤醒,并希望在检测到任何新 pc 的 mac 地址时自动获取它们,这样用户就不必手动输入它。因此,如果您知道通过各种方式获取远程 PC 的 MAC 的更好方法,请告诉我,我会改用它。

我意识到 java 可能不是用于此的最佳语言,但它是我目前唯一知道的一种语言,这只是我在工作期间休息时的一个有趣的小项目。

**编辑:如果它需要密码,我只想忽略那台 PC 并终止进程并转到下一台 PC

最佳答案

您需要处理与流程关联的所有流,包括 InputStream、ErrorStream 和 OutputStream。您在命令行上看到的文本将来自 InputStream,然后您将希望通过 OutputStream 传递请求的信息。

您需要在各自的线程中读取 InputStream 和 ErrorStream。如果它们传递文本,我经常将它们包装在 Scanner 对象中,并且我经常将 OutputStream 包装在 BufferedOutputStream 中,然后将其包装在 PrintStream 对象中。


例如,

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Scanner;

class Test1 {
private static PrintStream out;

public static void main(String[] args) {
String hostName = "testpc";
String[] commands = {"getmac", "/s", hostName,
"/nh"};
ProcessBuilder builder = new ProcessBuilder(commands);

// builder.inheritIO(); // I avoid this. It was messing me up.

try {
Process proc = builder.start();
InputStream errStream = proc.getErrorStream();
InputStream inStream = proc.getInputStream();
OutputStream outStream = proc.getOutputStream();

new Thread(new StreamGobbler("in", out, inStream)).start();
new Thread(new StreamGobbler("err", out, errStream)).start();

out = new PrintStream(new BufferedOutputStream(outStream));
int errorCode = proc.waitFor();
System.out.println("error code: " + errorCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}

class StreamGobbler implements Runnable {
private PrintStream out;
private Scanner inScanner;
private String name;

public StreamGobbler(String name, PrintStream out, InputStream inStream) {
this.name = name;
this.out = out;
inScanner = new Scanner(new BufferedInputStream(inStream));
}

@Override
public void run() {
while (inScanner.hasNextLine()) {
String line = inScanner.nextLine();

// do something with the line!
// check if requesting password

System.out.printf("%s: %s%n", name, line);
}
}
}

关于等待输入的 Java ProcessBuilder 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878415/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com