我试图将输入发送到从ProcessBuilder运行的nmap进程,但我没有看到正在运行的nmap进程的响应。我已查看了nmap源代码,并接受来自TTY的运行时交互式输入,因此除了直接使用/bin/bash -c
之外,我还尝试使用/usr/bin/nmap
运行它。
我有另一个线程从nmap,using this answer读取stdout。这是我的代码:
ProcessBuilder builder = new ProcessBuilder("/usr/bin/nmap", "-v", "-sT", "192.168.1.1-40");
//ProcessBuilder builder = new ProcessBuilder("/bin/bash", "-c", "\"\"/usr/bin/nmap -v -sT 192.168.1.1-40\"\"");
builder.redirectErrorStream(true);
Process proc = builder.start();
LogStreamReader lsr = new LogStreamReader(proc.getInputStream());
Thread thread = new Thread(lsr, "LogStreamReader");
thread.start();
while(thread.isAlive()) {
OutputStream stdin = proc.getOutputStream ();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
System.out.println("Sending input to process...");
writer.write("a");
writer.close();
Thread.sleep(2000);
}
nmap应该通过打印扫描的完成百分比/ ETA来响应writer.write(a)
,但它没有。
我还尝试在类似于LogStreamReader线程的单独线程中运行编写器,但仍然没有...
我错过了什么吗?
更新
我被告知nmap有一个选项--stats-every
,它完全符合我的需要,所以这个问题就解决了。我无法找到写入nmap使用的tty的方法。
答案 0 :(得分:1)
Nmap的运行时交互不是来自STDIN,而是来自TTY(引用this nmap-dev thread)。我不是Java专家,但我认为ProcessBuilder
不支持这种互动。
答案 1 :(得分:1)
有一个用于运行Nmap的Java库,名为Nmap4j。你可能会觉得有帮助。它位于sourceforge:nmap4j.sourceforge.net。