1

我正在尝试将输入发送到从 ProcessBuilder 运行的 nmap 进程,但我没有看到正在运行的 nmap 进程的响应。我查看了 nmap 源代码,它接受来自 TTY 的运行时交互式输入,所以我尝试使用/bin/bash -c除了直接使用之外运行它/usr/bin/nmap

我有另一个线程使用这个答案从 nmap 读取标准输出。这是我的代码:

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);
}

writer.write(a)nmap 应该通过打印出扫描的完成百分比/ETA 来响应,但事实并非如此。

我还尝试在类似于 LogStreamReader 线程的单独线程中运行编写器,但仍然没有...

我错过了什么吗?

更新: 我被告知 nmap 有一个选项--stats-every可以完全满足我的需要,所以这已经解决了。我找不到写入 nmap 使用的 tty 的方法。

4

2 回答 2

1

Nmap 的运行时交互不是来自 STDIN,而是来自 TTY(参考这个 nmap-dev 线程)。我不是 Java 专家,但我认为不ProcessBuilder支持这种交互。

于 2012-11-19T04:25:31.517 回答
1

有一个用于运行 Nmap 的 Java 库,称为 Nmap4j。您可能会发现这很有帮助。它位于 sourceforge:nmap4j.sourceforge.net。

于 2012-11-19T17:56:55.470 回答