commit 0f6d9340e21936112ac36309e4ff23724756a38a
parent 4605bf7c9c579463b4bb8995611e74b0aa68deb8
Author: Matthias Jaros <jaros@mailbox.org>
Date: Wed, 1 Jul 2026 20:39:54 +0200
Added quiet flag
Diffstat:
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:");