自学内容网 自学内容网

java调用Naabu进行端口扫描、Nucei进行漏洞扫描

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class test {

    public static void main(String[] args) {
        // 设置exe文件的路径
        String exePath = "D:\\IDEA\\untitled1\\src\\naabu.exe";
        // 设置命令及其参数
        ProcessBuilder processBuilder = new ProcessBuilder(exePath, "-host", "127.0.0.1");

        try {
            // 启动子进程
            Process process = processBuilder.start();

            // 获取子进程的输出流(标准输入)
            OutputStream stdin = process.getOutputStream();
            // 写入一个换行符,相当于按下回车
            stdin.write("\n".getBytes(StandardCharsets.UTF_8));
            stdin.flush();
            stdin.close(); // 关闭标准输入,表示不再输入

            // 获取子进程的标准输出和错误输出
            String stdout = readStream(process.getInputStream());
            String stderr = readStream(process.getErrorStream());

            // 等待子进程执行完毕
            int exitCode = process.waitFor();

            // 打印输出结果
            if (!stdout.isEmpty()) {
                System.out.println("输出结果:\n" + stdout);
            }

            // 打印错误信息
            if (!stderr.isEmpty()) {
                System.out.println("错误信息:\n" + stderr);
            }

            // 可选:打印子进程的退出码
            System.out.println("子进程退出码: " + exitCode);

        } catch (IOException e) {
            System.err.println("执行命令时发生IO错误: " + e.getMessage());
            e.printStackTrace();
        } catch (InterruptedException e) {
            System.err.println("子进程被中断: " + e.getMessage());
            e.printStackTrace();
            Thread.currentThread().interrupt(); // 重设中断状态
        }
    }

    /**
     * 读取输入流并返回其内容作为字符串。
     *
     * @param inputStream 要读取的输入流
     * @return 输入流的内容
     * @throws IOException 如果发生IO错误
     */
    private static String readStream(InputStream inputStream) throws IOException {
        StringBuilder result = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line).append(System.lineSeparator());
            }
        }
        return result.toString().trim();
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

public class test2 {

    /**
     * 异步读取流并通过回调处理每一行
     *
     * @param stream    输入流(标准输出或标准错误)
     * @param callback 处理每一行的回调函数
     */
    public static void readStream(InputStream stream, Consumer<String> callback) {
        new Thread(() -> {
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    callback.accept(line);
                }
            } catch (IOException e) {
                System.err.println("读取流时发生错误: " + e.getMessage());
            }
        }).start();
    }

    /**
     * 运行 nuclei.exe 并处理其输出
     */
    public static void runNuclei() {
        // 配置 nuclei.exe 的路径和工作目录
        String nucleiPath = "D:\\IDEA\\untitled1\\src\\nuclei.exe";
        String[] command = {nucleiPath, "-target", "netegn.com"};
        String workingDir = "D:\\IDEA\\untitled1\\src";

        // 使用 ProcessBuilder 设置进程信息
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.directory(new java.io.File(workingDir));

        // 将子进程的标准输入重定向为关闭,以防止子进程等待输入
        processBuilder.redirectInput(ProcessBuilder.Redirect.PIPE); // 使用 PIPE 以便关闭输出流

        Process process;
        try {
            // 启动子进程
            process = processBuilder.start();
            // 立即关闭子进程的标准输入
            process.getOutputStream().close();
        } catch (IOException e) {
            System.err.println("无法启动进程: " + e.getMessage());
            return;
        }

        // 创建并启动线程读取标准输出
        readStream(process.getInputStream(), System.out::println);

        // 创建并启动线程读取标准错误
        readStream(process.getErrorStream(), line -> System.err.println(line));

        try {
            // 设置超时时间为120秒(根据需要调整)
            boolean finished = process.waitFor(300, TimeUnit.SECONDS);
            if (!finished) {
                // 超时,强制终止子进程
                process.destroyForcibly();
                System.err.println("命令执行超时,已终止子进程。");
            }
        } catch (InterruptedException e) {
            // 等待进程时发生中断,强制终止子进程
            process.destroyForcibly();
            System.err.println("等待进程时发生错误: " + e.getMessage());
            Thread.currentThread().interrupt(); // 重新设置中断状态
        }

        // 获取并打印进程的退出码
        try {
            int exitCode = process.exitValue();
            System.out.println("命令执行完毕,退出码 " + exitCode);
        } catch (IllegalThreadStateException e) {
            System.err.println("进程尚未终止。");
        }
    }

    public static void main(String[] args) {
        runNuclei();
    }
}

原文地址:https://blog.csdn.net/weixin_35770067/article/details/145264653

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!