jscanner

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 0f6d9340e21936112ac36309e4ff23724756a38a
parent 4605bf7c9c579463b4bb8995611e74b0aa68deb8
Author: Matthias Jaros <jaros@mailbox.org>
Date:   Wed,  1 Jul 2026 20:39:54 +0200

Added quiet flag

Diffstat:
Msrc/main/java/com/it_jaros/jscanner/App.java | 5++---
Msrc/main/java/com/it_jaros/jscanner/CliDefaults.java | 13+++++++------
Msrc/main/java/com/it_jaros/jscanner/CliParser.java | 13+++++++++----
Msrc/main/java/com/it_jaros/jscanner/ProgressBar.java | 9++++++---
Msrc/main/java/com/it_jaros/jscanner/ScanOptions.java | 2+-
Msrc/main/java/com/it_jaros/jscanner/Scanner.java | 18++++++++++++------
6 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/src/main/java/com/it_jaros/jscanner/App.java b/src/main/java/com/it_jaros/jscanner/App.java @@ -9,8 +9,7 @@ public class App { CliParser cliParser = new CliParser(); try { ScanOptions options = cliParser.parseArgs(args); - Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis(), - options.delayInMillis(), options.maxWorkersPerHost(), options.maxHostsLimit(), options.disableHostCheck()); + Scanner scanner = new Scanner(options); printResults(scanner.scan(options), options.showFilteredPorts()); } catch (IllegalArgumentException e) { System.out.printf("Error while parsing arguments: %s", e.getMessage()); @@ -35,7 +34,7 @@ public class App { System.out.printf("\t (%d) open:\t%s%n", result.openPorts().cardinality(), map(result.openPorts(), result.bannerRecognition())); } if (showFilteredPorts && !result.filteredPorts().isEmpty()) { - System.out.printf("\t (%d) filtered:\t%s%n", result.filteredPorts().cardinality(), map(result.filteredPorts(), null)); + System.out.printf("\t (%d) filtered:\t%s%n", result.filteredPorts().cardinality(), map(result.filteredPorts())); } System.out.println(); } diff --git a/src/main/java/com/it_jaros/jscanner/CliDefaults.java b/src/main/java/com/it_jaros/jscanner/CliDefaults.java @@ -1,12 +1,13 @@ package com.it_jaros.jscanner; public class CliDefaults { - public static final int SOCKET_LIMIT = 1000; - public static final int DELAY_IN_MILLIS = 0; - public static final int TIMEOUT_IN_MILLIS = 1000; - public static final int MAX_WORKERS_PER_HOST = 1000; - public static final int MAX_HOSTS_LIMIT = 10; public static final String PORTS = "1-1024"; - public static final boolean SHOW_FILTERED_PORTS = false; public static final boolean DISABLE_HOST_CHECK = false; + public static final boolean QUIET = false; + public static final boolean SHOW_FILTERED_PORTS = false; + public static final int DELAY_IN_MILLIS = 0; + public static final int MAX_HOSTS_LIMIT = 10; + public static final int MAX_WORKERS_PER_HOST = 1000; + public static final int SOCKET_LIMIT = 1000; + public static final int TIMEOUT_IN_MILLIS = 1000; } diff --git a/src/main/java/com/it_jaros/jscanner/CliParser.java b/src/main/java/com/it_jaros/jscanner/CliParser.java @@ -19,6 +19,7 @@ public class CliParser { String ports = CliDefaults.PORTS; boolean showFilteredPorts = CliDefaults.SHOW_FILTERED_PORTS; boolean disableOnlineCheck = CliDefaults.DISABLE_HOST_CHECK; + boolean quiet = CliDefaults.QUIET; String hostsFile = null; for (int i = 0; i < args.length; i++) { @@ -59,16 +60,19 @@ public class CliParser { case "--input", "-i": hostsFile = requireValue(args, ++i, currentArg); break; + case "--quiet", "-q": + quiet = true; + break; default: throw new IllegalArgumentException("No such param " + currentArg); } } System.out.printf( - "Parsed arguments: hostsArgv('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxHostsLimit(%s), showFilteredPorts(%s), disableOnlineCheck(%s), file(%s) %n", - hostsArgv, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxHostsLimit, showFilteredPorts, disableOnlineCheck, hostsFile); + "Parsed arguments: hostsArgv('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxHostsLimit(%s), showFilteredPorts(%s), disableOnlineCheck(%s), file(%s), quiet(%b) %n", + hostsArgv, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxHostsLimit, showFilteredPorts, disableOnlineCheck, hostsFile, quiet); - return new ScanOptions(hostsArgv.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxHostsLimit, ports, showFilteredPorts, disableOnlineCheck, hostsFile); + return new ScanOptions(hostsArgv.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxHostsLimit, ports, showFilteredPorts, disableOnlineCheck, hostsFile, quiet); } private String requireValue(String[] args, int index, String option) { @@ -102,10 +106,11 @@ public class CliParser { --maxHostsLimit, -m:\tMax number of hosts that are scanned at the same time (Default: %d) --maxWorkersPerHost, -mh:\tVirtual Worker Threads run per Host. Higher doesn't mean necessarily faster. But the more you use the more RAM is required (Default: %d) --ports, -p:\t\tDefine ports to be scanned (Default: %s) + --quiet, -q:\t\tDo not output progress bar (Default: %b) --showFilteredPorts, -sf:\tShow also filtered ports (Default: %b) --socketLimit, -sl:\t\tSocket limit in total. You can not scan more ports than allowed here (Default: %d) --timeout, -t:\t\tTimeout in millis per connection attempt, 0 means infinite (Default: %d) - """.formatted(CliDefaults.DELAY_IN_MILLIS, CliDefaults.DISABLE_HOST_CHECK, CliDefaults.MAX_HOSTS_LIMIT, CliDefaults.MAX_WORKERS_PER_HOST, CliDefaults.PORTS, CliDefaults.SHOW_FILTERED_PORTS, CliDefaults.SOCKET_LIMIT, CliDefaults.TIMEOUT_IN_MILLIS) + """.formatted(CliDefaults.DELAY_IN_MILLIS, CliDefaults.DISABLE_HOST_CHECK, CliDefaults.MAX_HOSTS_LIMIT, CliDefaults.MAX_WORKERS_PER_HOST, CliDefaults.PORTS, CliDefaults.QUIET, CliDefaults.SHOW_FILTERED_PORTS, CliDefaults.SOCKET_LIMIT, CliDefaults.TIMEOUT_IN_MILLIS) ); usage.append(""" diff --git a/src/main/java/com/it_jaros/jscanner/ProgressBar.java b/src/main/java/com/it_jaros/jscanner/ProgressBar.java @@ -42,9 +42,10 @@ public class ProgressBar { return 120; } - public void start() { + public void start(boolean quiet) { this.hosts = new ArrayList<>(); System.out.print("Scanning targets...\n\n"); + if (quiet) { return; } ui.scheduleAtFixedRate(() -> { lock.lock(); drawProgress(false); @@ -105,12 +106,14 @@ public class ProgressBar { return String.format("%s%s%s %s %s", label, " ".repeat(spacesBetween),statsLeft, brackets, statsRight); } - public void stop() { + public void stop(boolean quiet) { ui.shutdown(); try { ui.awaitTermination(10, TimeUnit.SECONDS); // we need to draw one last time for the 100% to appear - drawProgress(true); + if (!quiet) { + drawProgress(true); + } } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); } diff --git a/src/main/java/com/it_jaros/jscanner/ScanOptions.java b/src/main/java/com/it_jaros/jscanner/ScanOptions.java @@ -2,4 +2,4 @@ package com.it_jaros.jscanner; import java.util.List; -public record ScanOptions(List<String> hostsArgv, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, int maxHostsLimit, String ports, boolean showFilteredPorts, boolean disableHostCheck, String hostsFile) {} +public record ScanOptions(List<String> hostsArgv, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, int maxHostsLimit, String ports, boolean showFilteredPorts, boolean disableHostCheck, String hostsFile, boolean quiet) {} diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java @@ -24,19 +24,25 @@ public class Scanner { private final Counter counter = new Counter(); private final ProgressBar progressBar = new ProgressBar(); private final Semaphore socketLimit; + private final boolean disableOnlineCheck; + private final boolean quiet; + private final int maxHostsLimit; + private final int maxWorkersPerHost; private final int timeoutInMillis; private final long delayInNanos; - private final int maxWorkersPerHost; - private final int maxHostsLimit; - private final boolean disableOnlineCheck; - public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis, int maxWorkersPerHost, int maxHostsLimit, boolean disableOnlineCheck) { + public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis, int maxWorkersPerHost, int maxHostsLimit, boolean disableOnlineCheck, boolean quiet) { this.timeoutInMillis = timeoutInMillis; this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis)); this.socketLimit = new Semaphore(socketLimit); this.maxWorkersPerHost = maxWorkersPerHost; this.maxHostsLimit = maxHostsLimit; this.disableOnlineCheck = disableOnlineCheck; + this.quiet = quiet; + } + + public Scanner(ScanOptions options) { + this(options.openSocketLimit(), options.timeoutInMillis(), options.delayInMillis(), options.maxWorkersPerHost(), options.maxHostsLimit(), options.disableHostCheck(), options.quiet()); } public List<ScanResult> scan(ScanOptions options) { @@ -70,7 +76,7 @@ public class Scanner { public List<ScanResult> scanHosts(Stream<String> hosts, String ports) throws IOException { List<ScanResult> results = new ArrayList<>(); - progressBar.start(); + progressBar.start(quiet); try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { CompletionService<ScanResult> completionService = new ExecutorCompletionService<>(executor); Queue<String> hostsInQueue = hosts.collect(Collectors.toCollection(ArrayDeque::new)); @@ -101,7 +107,7 @@ public class Scanner { } } - progressBar.stop(); + progressBar.stop(quiet); System.out.println("--------------------"); System.out.println("Finished scan!"); System.out.println("Stats:");