DEV Community

Cover image for Building a CLI Tool With Python That Solves a Real Problem
Sudhir Bahadure
Sudhir Bahadure

Posted on

Building a CLI Tool With Python That Solves a Real Problem

Introduction

Did you know that the average person spends around 2.5 hours per day searching for information online, with a significant portion of that time spent on cybersecurity-related tasks? To make this process more efficient, you will build a Command-Line Interface (CLI) tool using Python that automates the process of scanning for open ports on a given IP address or domain, a crucial task in identifying potential security vulnerabilities. To get started, you will need Python 3.8 or higher installed on your system, along with the argparse and socket libraries, which come pre-installed with Python.

Table of Contents

  1. Introduction
  2. Setup and Background
  3. Defining the CLI Tool's Functionality
  4. Implementing the Port Scanning Logic
  5. Real-World Application and Deployment
  6. Conclusion

Setup and Background

python automation
Before diving into the code, it's essential to understand why port scanning is a critical task in cybersecurity. Port scanning involves sending requests to a range of ports on a target system to determine which ports are open and listening for connections. This information can be used to identify potential vulnerabilities in the system. To begin, you'll need to create a new Python script. Here's a basic template for your CLI tool:

import argparse
import socket

def main():
    parser = argparse.ArgumentParser(description='Port Scanner')
    parser.add_argument('-t', '--target', help='Target IP address or domain')
    parser.add_argument('-p', '--ports', help='Range of ports to scan (e.g., 1-1024)')
    args = parser.parse_args()

    if args.target and args.ports:
        # Port scanning logic will go here
        print(f"Scanning {args.target} for open ports...")
    else:
        parser.print_help()

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Defining the CLI Tool's Functionality

  1. Define the target and ports: The tool should accept two arguments: the target IP address or domain, and the range of ports to scan.
  2. Parse the arguments: Use the argparse library to parse the command-line arguments.
  3. Validate the input: Ensure that both the target and ports are provided.

Here's an updated code block that includes input validation:

import argparse
import socket

def main():
    parser = argparse.ArgumentParser(description='Port Scanner')
    parser.add_argument('-t', '--target', help='Target IP address or domain', required=True)
    parser.add_argument('-p', '--ports', help='Range of ports to scan (e.g., 1-1024)', required=True)
    args = parser.parse_args()

    target = args.target
    ports = args.ports

    # Validate the ports range
    try:
        start_port, end_port = map(int, ports.split('-'))
        if start_port < 0 or end_port > 65535:
            raise ValueError
    except ValueError:
        print("Invalid ports range. Please use the format 'start-end'.")
        return

    # Port scanning logic will go here
    print(f"Scanning {target} for open ports...")

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Implementing the Port Scanning Logic

To scan for open ports, you'll use the socket library to send a connection request to each port in the specified range. If the connection is successful, the port is considered open.

import argparse
import socket

def scan_port(target, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)
        result = sock.connect_ex((target, port))
        sock.close()
        if result == 0:
            return True
    except socket.error:
        pass
    return False

def main():
    parser = argparse.ArgumentParser(description='Port Scanner')
    parser.add_argument('-t', '--target', help='Target IP address or domain', required=True)
    parser.add_argument('-p', '--ports', help='Range of ports to scan (e.g., 1-1024)', required=True)
    args = parser.parse_args()

    target = args.target
    ports = args.ports

    try:
        start_port, end_port = map(int, ports.split('-'))
        if start_port < 0 or end_port > 65535:
            raise ValueError
    except ValueError:
        print("Invalid ports range. Please use the format 'start-end'.")
        return

    open_ports = []
    for port in range(start_port, end_port + 1):
        if scan_port(target, port):
            open_ports.append(port)

    if open_ports:
        print(f"Open ports on {target}: {', '.join(map(str, open_ports))}")
    else:
        print(f"No open ports found on {target}.")

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Real-World Application and Deployment

This CLI tool can be used to identify potential security vulnerabilities in a system by scanning for open ports. For example, you can use this tool to scan your own server to ensure that only necessary ports are open. When working with remote servers, consider using a VPN like NordVPN (68% off + 3 months free) to secure your connection. Additionally, when hosting your own website, choose a reliable web hosting service like Hostinger (up to 80% off hosting) and register your domain with Namecheap (cheapest domains online).

Conclusion

In this tutorial, you learned how to build a CLI tool with Python that scans for open ports on a given IP address or domain. The key takeaways from this project are:

  1. Port scanning is a crucial task in cybersecurity: Identifying open ports can help you discover potential security vulnerabilities in a system.
  2. Using the socket library for port scanning: The socket library provides a simple way to send connection requests to ports and determine if they are open.
  3. Implementing a CLI tool with argparse: The argparse library makes it easy to create user-friendly CLI tools with input validation and help messages.

To further develop your Python automation skills, consider exploring the Python Automation Mastery series for more tutorials and projects.

💡 Found this helpful?

If this tutorial saved you time or solved a problem, consider:

Support me on Ko-fi

Every coffee keeps me writing free tutorials like this one!


This article was written with AI assistance and reviewed for technical accuracy.
Part of the **Python Automation Mastery* series — Follow for more free tutorials*

#aBotWroteThis

Top comments (0)