将输入发送到nmap进程

时间:2012-11-18 19:39:42

标签: java stdin processbuilder nmap

我试图将输入发送到从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的方法。

2 个答案:

答案 0 :(得分:1)

Nmap的运行时交互不是来自STDIN,而是来自TTY(引用this nmap-dev thread)。我不是Java专家,但我认为ProcessBuilder不支持这种互动。

答案 1 :(得分:1)

有一个用于运行Nmap的Java库,名为Nmap4j。你可能会觉得有帮助。它位于sourceforge:nmap4j.sourceforge.net。