
नेटवर्क स्कैनर बाइनरी को आमंत्रित करने के लिए इडियोमैटिक Go लाइब्रेरी, जो होस्ट डिस्कवरी, पोर्ट स्कैनिंग, सेवा/OS पहचान, और सुरक्षा ऑडिटिंग के लिए स्क्रिप्टेड भेद्यता जाँच को सक्षम बनाती है।
इस लाइब्रेरी का उद्देश्य Go डेवलपर्स के लिए स्वाभाविक (idiomatic) nmap बाइंडिंग्स प्रदान करना है, ताकि golang का उपयोग करके सुरक्षा ऑडिट टूल लिखना आसान हो सके।
Nmap (Network Mapper) एक मुफ्त और ओपन-सोर्स नेटवर्क स्कैनर है जिसे Gordon Lyon ने बनाया है। Nmap का उपयोग कंप्यूटर नेटवर्क पर होस्ट और सेवाओं का पता लगाने के लिए किया जाता है, पैकेट भेजकर और प्रतिक्रियाओं का विश्लेषण करके।
Nmap कंप्यूटर नेटवर्क की जाँच के लिए कई सुविधाएँ प्रदान करता है, जिनमें होस्ट खोज और सेवा तथा ऑपरेटिंग सिस्टम पहचान शामिल हैं। ये सुविधाएँ स्क्रिप्ट द्वारा विस्तार योग्य हैं जो अधिक उन्नत सेवा पहचान, भेद्यता पहचान और अन्य सुविधाएँ प्रदान करती हैं। Nmap स्कैन के दौरान विलंबता और भीड़ (latency and congestion) सहित नेटवर्क स्थितियों के अनुकूल हो सकता है।
अधिकांश पेंटेस्ट टूल वर्तमान में Python का उपयोग करके लिखे जाते हैं, Go का नहीं, क्योंकि स्क्रिप्ट जल्दी लिखना आसान होता है, बहुत सारी लाइब्रेरी उपलब्ध होती हैं, और यह उपयोग में सरल भाषा है। हालाँकि, मजबूत और विश्वसनीय एप्लिकेशन लिखने के लिए Go बेहतर टूल है। यह स्टैटिक रूप से कंपाइल होती है, इसमें स्टैटिक टाइप सिस्टम होता है, प्रदर्शन काफी बेहतर होता है, यह भी उपयोग में बहुत सरल भाषा है और goroutines शानदार हैं... लेकिन मैं शायद थोड़ा पक्षपाती हो सकता हूँ, इसलिए असहमत होने में संकोच न करें।
यह लाइब्रेरी Go के exec पैकेज का उपयोग करके nmap बाइनरी को कॉल करती है और XML आउटपुट को पार्स करती है। इसका मतलब है कि इस लाइब्रेरी के काम करने के लिए nmap आपके PATH पर इंस्टॉल और उपलब्ध होना चाहिए।
संगतता nmap के वर्तमान नवीनतम संस्करण, 7.98, के साथ पुष्टि की गई है।
कुछ स्कैन प्रकारों के लिए उन्नत विशेषाधिकारों (elevated privileges) की आवश्यकता होती है (उदाहरण के लिए, SYN स्कैन, OS पहचान, या raw socket उपयोग)। यदि आप उन विकल्पों को सक्षम करते हैं, तो आपको अपने प्रोग्राम को sudo या आपके प्लेटफ़ॉर्म के लिए उपयुक्त capabilities के साथ चलाने की आवश्यकता हो सकती है।
[!TIP] अनप्रिविलेज्ड रन के लिए, connect स्कैन (जैसे
-sT) को प्राथमिकता दें।
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/Ullaakut/nmap/v4"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
// Equivalent to `/usr/local/bin/nmap -p 80,443,843 google.com facebook.com youtube.com`,
// with a 5-minute timeout.
scanner, err := nmap.NewScanner(
nmap.WithTargets("scanme.nmap.org"),
nmap.WithPorts("80,443,843"),
)
if err != nil {
log.Fatalf("creating nmap scanner: %v", err)
}
result, err := scanner.Run(ctx)
if err != nil {
log.Fatalf("running network scan: %v", err)
}
warnings := result.Warnings()
if len(warnings) > 0 {
log.Printf("warning: %v\n", warnings) // Warnings are non-critical errors from nmap.
}
// Use the results to print an example output
for _, host := range result.Hosts {
if len(host.Ports) == 0 || len(host.Addresses) == 0 {
continue
}
fmt.Printf("Host %q:\n", host.Addresses[0])
for _, port := range host.Ports {
fmt.Printf("\tPort %d/%s %s %s\n", port.ID, port.Protocol, port.State, port.Service.Name)
}
}
fmt.Printf("Nmap done: %d hosts up scanned in %.2f seconds\n", len(result.Hosts), result.Stats.Finished.Elapsed)
}
उपरोक्त प्रोग्राम का आउटपुट:
Host "45.33.32.156":
Port 80/tcp open http
Port 443/tcp closed https
Port 843/tcp closed
Nmap done: 1 hosts up scanned in 0.42 seconds
[!IMPORTANT] यह टर्मिनल escape sequences पर निर्भर करता है और केवल तब काम करता है जब प्रक्रिया TTY से जुड़ी हो।
[!NOTE] प्रगति के monotonic रूप से बढ़ने की गारंटी नहीं है: nmap शेष समय का अनुमान लगाता है और उस अनुमान को संशोधित कर सकता है, जिससे रिपोर्ट किया गया प्रतिशत घट सकता है।
package main
import (
"context"
"log"
"time"
"github.com/Ullaakut/nmap/v4"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
scanner, err := nmap.NewScanner(
nmap.WithTargets("scanme.nmap.org"),
nmap.WithPorts("1-1024"),
nmap.WithTimingTemplate(nmap.TimingAggressive),
nmap.WithProgress(time.Second, handleProgress),
)
if err != nil {
log.Fatalf("creating nmap scanner: %v", err)
}
_, err = scanner.Run(ctx)
if err != nil {
log.Fatalf("running network scan: %v", err)
}
}
func handleProgress(p nmap.TaskProgress) {
log.Println("Current progress: ", p.Percent)
}
यह उदाहरण निम्नलिखित आउटपुट देता है:
2026/01/27 16:13:02 task "Connect Scan": 2.59% remaining 38
2026/01/27 16:13:02 task "Connect Scan": 21.26% remaining 4
2026/01/27 16:13:04 task "Connect Scan": 42.61% remaining 5
2026/01/27 16:13:04 task "Connect Scan": 45.51% remaining 4
2026/01/27 16:13:05 task "Connect Scan": 53.44% remaining 4
2026/01/27 16:13:07 task "Connect Scan": 59.77% remaining 5
2026/01/27 16:13:07 task "Connect Scan": 62.77% remaining 4
2026/01/27 16:13:08 task "Connect Scan": 73.24% remaining 3
2026/01/27 16:13:09 task "Connect Scan": 81.71% remaining 2
2026/01/27 16:13:10 task "Connect Scan": 92.92% remaining 1
2026/01/27 16:13:11 task "Connect Scan": 100.00% remaining 0
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/Ullaakut/nmap/v4"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
scanner, err := nmap.NewScanner(
nmap.WithTargets("scanme.nmap.org"),
nmap.WithPorts("1-1024"),
)
if err != nil {
log.Fatalf("creating nmap scanner: %v", err)
}
stdout, stderr, resultCh, err := scanner.RunAsync(ctx)
if err != nil {
log.Fatalf("running network scan: %v", err)
}
for {
select {
case <-ctx.Done():
log.Fatalf("scan timed out: %v", ctx.Err())
case out := <-stdout:
fmt.Printf("nmap output: %s\n", out)
case errOut := <-stderr:
fmt.Printf("nmap error output: %s\n", errOut)
case result := <-resultCh:
if result.Err != nil {
log.Fatalf("running network scan: %v", result.Err)
}
fmt.Printf("Nmap done: %d hosts up\n", len(result.Result.Hosts))
return
}
}
}
अधिक उपयोग उदाहरणों के लिए examples निर्देशिका देखें।
Cameradar पहले से ही इस लाइब्रेरी का उपयोग अपने कोर में nmap से संवाद करने, RTSP स्ट्रीम खोजने और उन्हें दूरस्थ रूप से एक्सेस करने के लिए करता है।
अधिक उदाहरण: